У меня есть Device
интерфейс:
public interface IDevice
{
double Measure();
}
Некоторые классы, которые реализуют этот интерфейс, имеют измерительный прибор:
public class InstrumentedDevice : IDevice
{
public MeasuringInstrument Instrument { get; set; }
public double Measure()
{
if (Instrument != null)
return Instrument.DoMeasuring();
return 0;
}
}
Я хотел бы сгруппировать экземпляры InstrumentedDevice
в соответствии с их свойством Instrument
, чтобы в результате был получен набор групп, в которых каждое устройство использует тот же инструмент, что и все другие устройства в его группе. *
Затем я хотел бы запустить новый поток для каждой группы и выполнить измерение параллельно.
Это будет выглядеть примерно так:
public void MeasureAllDevices(IEnumerable<InstrumentedDevice> devices)
{
var groups = devices.GroupBy(d => d.Instrument);
foreach (var gr in groups)
{
var bgw = new BackgroundWorker();
bgw.DoWork += (s, e) =>
{
foreach (var device in gr)
{
device.Measure();
}
};
bgw.RunWorkerAsync();
}
}
Проблема в том, что я не получаю коллекцию InstrumentedDevice
в качестве параметра для MeasureAllDevices
. Я получаю коллекцию IDevice
:
public void MeasureAllDevices(IEnumerable<IDevice> devices)
{
}
У меня такой вопрос : Есть ли способ, которым я могу следовать, чтобы решить мою проблему? Не все устройства будут иметь MeasuringInstrument
, и некоторые устройства могут иметь разные средства определения, могут ли они быть измерены параллельно.
Я бы хотел добавить что-то в интерфейс IDevice
, например CanBeMultiThreadedWith(IDevice other)
, но я не уверен, как это будет работать.