Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I think you should implement your own <code>IProducerConsumerCollection&lt;T&gt;</code>. That's why it's an interface: so that you could easily make your own.</p> <p>You could do it using <code>Dictionary&lt;K,V&gt;</code> and <code>Queue&lt;T&gt;</code> to make sure receiving the data is fair, i.e. if you have just one device that produces data very fast, you won't send data just from this one.</p> <pre><code>public class DeviceDataQueue&lt;TDevice, TData&gt; : IProducerConsumerCollection&lt;Tuple&lt;TDevice, TData&gt;&gt; { private readonly object m_lockObject = new object(); private readonly Dictionary&lt;TDevice, TData&gt; m_data = new Dictionary&lt;TDevice, TData&gt;(); private readonly Queue&lt;TDevice&gt; m_queue = new Queue&lt;TDevice&gt;(); //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&lt;TDevice, TData&gt; 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&lt;TDevice, TData&gt; 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; } } } </code></pre> <p>When used along these lines:</p> <pre><code>Queue = new BlockingCollection&lt;Tuple&lt;IDevice, Data&gt;&gt;( new DeviceDataQueue&lt;IDevice, Data&gt;()); 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)); } </code></pre> <p>it produces the following output:</p> <pre><code>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. </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload