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...