//14 生产者->消费者 static async Task Worker14() { chan <int> chan = chan <int> .make(-1);//无限缓存,使用默认strand generator.children children = new generator.children(); children.go(async delegate() { for (int i = 0; i < 3; i++) { await chan.send(i); await generator.sleep(1000); } chan.close(); }); children.go(async delegate() { for (int i = 10; i < 13; i++) { await chan.send(i); await generator.sleep(1000); } chan.close(); }); children.go(async delegate() { while (true) { chan_recv_wrap <int> res = await chan.receive(); if (res.state == chan_state.closed) { Log($"chan 已关闭"); break; } Log($"recv0 {res.msg}"); } }); children.go(async delegate() { while (true) { chan_recv_wrap <int> res = await chan.receive(); if (res.state == chan_state.closed) { Log($"chan 已关闭"); break; } Log($"recv1 {res.msg}"); } }); await children.wait_all(); }
static async Task Consumer() { Console.WriteLine("receive chan1 {0}", await _chan1.receive()); Console.WriteLine("send chan2 {0}", await _chan2.send(system_tick.get_tick_us())); Console.WriteLine("receive chan3 {0}", await _chan3.receive()); while (true) { await generator.select().case_receive(_chan1, async delegate(long msg) { Console.WriteLine("select receive chan1 {0}", msg); await generator.sleep(100); }).case_send(_chan2, system_tick.get_tick_us(), async delegate() { Console.WriteLine("select send chan2"); await generator.sleep(100); }).case_receive(_chan3, async delegate(long msg) { Console.WriteLine("select receive chan3 {0}", msg); await generator.sleep(100); }).case_receive(_csp, async delegate(long msg) { Console.WriteLine("select csp delay {0}", system_tick.get_tick_us() - msg); await generator.sleep(100); return(system_tick.get_tick_us()); }).end(); } }
//15 超时接收 static async Task Worker15() { chan <int> chan = chan <int> .make(1);//缓存1个 generator.children children = new generator.children(); children.go(async delegate() { for (int i = 0; i < 3; i++) { await chan.send(i); await generator.sleep(1000); } }); children.go(async delegate() { while (true) { chan_recv_wrap <int> res = await chan.timed_receive(2000); if (res.state == chan_state.overtime) { Log($"recv 超时"); break; } Log($"recv {res.msg}"); } }); await children.wait_all(); }
static async Task Producer3() { while (true) { await _chan3.send(system_tick.get_tick_us()); await generator.sleep(1000); } }
//18 一轮选择一个接收 static async Task Worker18() { chan <int> chan1 = chan <int> .make(0); chan <int> chan2 = chan <int> .make(0); generator.children children = new generator.children(); children.go(async delegate() { for (int i = 0; i < 3; i++) { await chan1.send(i); await generator.sleep(1000); } chan1.close(); }); children.go(async delegate() { for (int i = 10; i < 13; i++) { await chan2.send(i); await generator.sleep(1000); } chan2.close(); }); children.go(async delegate() { await generator.select().case_receive(chan1, async delegate(int p) { await generator.sleep(100); Log($"recv1 {p}"); }).case_receive(chan2, async delegate(int p) { await generator.sleep(100); Log($"recv2 {p}"); }).loop(); Log($"chan 已关闭"); }); await children.wait_all(); }