我想你应该实现自己的IProducerConsumerCollection<T>
。这就是为什么它是一个接口:让你可以轻松地制作自己。
您可以使用Dictionary<K,V>
和Queue<T>
来确保接收数据的公平性,即如果您只有一台设备可非常快速地生成数据,则不会仅从该设备发送数据。
public class DeviceDataQueue<TDevice, TData>
: IProducerConsumerCollection<Tuple<TDevice, TData>>
{
private readonly object m_lockObject = new object();
private readonly Dictionary<TDevice, TData> m_data
= new Dictionary<TDevice, TData>();
private readonly Queue<TDevice> m_queue = new Queue<TDevice>();
//some obviously implemented methods elided, just make sure they are thread-safe
public int Count { get { return m_queue.Count; } }
public object SyncRoot { get { return m_lockObject; } }
public bool IsSynchronized { get { return true; } }
public bool TryAdd(Tuple<TDevice, TData> item)
{
var device = item.Item1;
var data = item.Item2;
lock (m_lockObject)
{
if (!m_data.ContainsKey(device))
m_queue.Enqueue(device);
m_data[device] = data;
}
return true;
}
public bool TryTake(out Tuple<TDevice, TData> item)
{
lock (m_lockObject)
{
if (m_queue.Count == 0)
{
item = null;
return false;
}
var device = m_queue.Dequeue();
var data = m_data[device];
m_data.Remove(device);
item = Tuple.Create(device, data);
return true;
}
}
}
当沿着这些线路中使用:
Queue = new BlockingCollection<Tuple<IDevice, Data>>(
new DeviceDataQueue<IDevice, Data>());
Device1 = new Device(1, TimeSpan.FromSeconds(3), Queue);
Device2 = new Device(2, TimeSpan.FromSeconds(5), Queue);
while (true)
{
var tuple = Queue.Take();
var device = tuple.Item1;
var data = tuple.Item2;
Console.WriteLine("{0}: Device {1} produced data at {2}.",
DateTime.Now, device.Id, data.Created);
Thread.Sleep(TimeSpan.FromSeconds(2));
}
它产生以下输出:
30.4.2011 20:40:43: Device 1 produced data at 30.4.2011 20:40:43.
30.4.2011 20:40:45: Device 2 produced data at 30.4.2011 20:40:44.
30.4.2011 20:40:47: Device 1 produced data at 30.4.2011 20:40:47.
30.4.2011 20:40:49: Device 2 produced data at 30.4.2011 20:40:49.
30.4.2011 20:40:51: Device 1 produced data at 30.4.2011 20:40:51.
30.4.2011 20:40:54: Device 2 produced data at 30.4.2011 20:40:54.
当有来自不同设备的消息集合中,哪一个你应该送?应该发送来自所有传感器的消息 – svick 2011-04-30 17:42:16
。每个传感器具有同等优先权如果带宽不足以发送来自所有传感器的所有消息,则可以跳过一些数据。例如,我们可以从每个传感器发送每秒二次/三次/四次测量结果 – javapowered 2011-04-30 20:47:18
如果您必须对每个传感器都公平,那么为什么传感器需要说他们有新的数据准备好?消费者可以按顺序轮询每个传感器,看看它是否有新的数据。如果它有新的数据,它会得到最新的并发送它,如果它不是新的,那么它只是跳过它。 – BrandonAGr 2011-04-30 20:56:05