4 using System.Collections.Generic;
5 using System.Threading.Tasks;
7 namespace SiliconStudio.Core.MicroThreading
18 public class Channel<T>
20 Queue<ChannelMicroThreadAwaiter<T>> receivers =
new Queue<ChannelMicroThreadAwaiter<T>>();
21 Queue<ChannelMicroThreadAwaiter<T>> senders =
new Queue<ChannelMicroThreadAwaiter<T>>();
25 Preference = ChannelPreference.PreferReceiver;
42 public int Balance {
get {
return senders.Count - receivers.Count; } }
52 if (receivers.Count == 0)
55 var microThread = MicroThread.Current;
57 waitingMicroThread.Result = data;
58 senders.Enqueue(waitingMicroThread);
59 return waitingMicroThread;
62 var receiver = receivers.Dequeue();
63 receiver.Result = data;
66 receiver.MicroThread.ScheduleContinuation(ScheduleMode.Last, receiver.Continuation);
70 receiver.MicroThread.ScheduleContinuation(ScheduleMode.First, receiver.Continuation);
71 throw new NotImplementedException();
74 receiver.IsCompleted =
true;
85 if (senders.Count == 0)
87 var microThread = MicroThread.Current;
88 if (microThread == null)
89 throw new Exception(
"Cannot receive out of micro-thread context.");
92 receivers.Enqueue(waitingMicroThread);
93 return waitingMicroThread;
96 var sender = senders.Dequeue();
99 sender.MicroThread.ScheduleContinuation(ScheduleMode.Last, sender.Continuation);
103 sender.MicroThread.ScheduleContinuation(ScheduleMode.First, sender.Continuation);
104 throw new NotImplementedException();
107 sender.IsCompleted =
true;
ChannelMicroThreadAwaiter< T > Send(T data)
Sends a value over the channel. If no other MicroThread is waiting for data, the sender will be block...
ChannelMicroThreadAwaiter< T > Receive()
Receives a value over the channel. If no other MicroThread is sending data, the receiver will be bloc...