System.Threading.Channels.dll System.Threading.Tasks.Extensions.dll System System.Threading System.Threading.Channels System.Threading.Tasks //using System; //using System.Threading; //using System.Threading.Tasks; //using System.Threading.Tasks.Extensions; //using System.Threading.Channels; Func tid = () => Thread.CurrentThread.ManagedThreadId; static BoundedChannelOptions one2one = new BoundedChannelOptions (1) {Capacity=1, SingleWriter=true, SingleReader=true,}; enum MessageTag {Toggle, Add, Get }; struct Message { public MessageTag Tag; public object Val; public override string ToString () { return Tag.ToString() + (Val != null? " " + Val.ToString(): ""); } }; Channel achan = Channel.CreateBounded (one2one); enum State {Active, Inactive}; async Task agent () { var state = State.Active; var deposit = 0; Message msg; for (;;) { switch (state) { case State.Active: msg = await achan.Reader.ReadAsync (); Console.WriteLine ("active {0} ({1})", deposit, msg); switch (msg.Tag) { case MessageTag.Toggle: state = State.Inactive; break; case MessageTag.Add: deposit += (int) msg.Val; break; case MessageTag.Get: //msg.Dump (); var rch = (Channel) msg.Val; await rch.Writer.WriteAsync (deposit); break; } break; case State.Inactive: msg = await achan.Reader.ReadAsync (); Console.WriteLine ("inactive {0} ({1})", deposit, msg); switch (msg.Tag) { case MessageTag.Toggle: state = State.Active; break; case MessageTag.Add: ; // nothing break; case MessageTag.Get: var rch = (Channel) msg.Val; await rch.Writer.WriteAsync (deposit); break; } break; } } } async Task Main() { var a = agent (); await achan.Writer.WriteAsync (new Message {Tag=MessageTag.Add, Val=10}); await achan.Writer.WriteAsync (new Message {Tag=MessageTag.Toggle, Val=null}); await achan.Writer.WriteAsync (new Message {Tag=MessageTag.Add, Val=20}); await achan.Writer.WriteAsync (new Message {Tag=MessageTag.Toggle, Val=null}); await achan.Writer.WriteAsync (new Message {Tag=MessageTag.Add, Val=30}); Thread.Sleep (10); Console.WriteLine (); var rch = Channel.CreateBounded (one2one); await achan.Writer.WriteAsync (new Message {Tag=MessageTag.Get, Val=rch}); var n = await rch.Reader.ReadAsync (); Console.WriteLine ("... got {0}", n); Console.WriteLine (); await achan.Writer.WriteAsync (new Message {Tag=MessageTag.Get, Val=rch}); var n2 = await rch.Reader.ReadAsync (); Console.WriteLine ("... got {0}", n2); //Console.WriteLine (" to exit"); //Console.ReadLine (); }