//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(); }
//19 一轮选择一个发送 static async Task Worker19() { 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 generator.select(true).case_send(chan1, i, async delegate() { Log($"send1 {i}"); await generator.sleep(1000); }).case_send(chan2, i, async delegate() { Log($"send2 {i}"); await generator.sleep(1000); }).end(); } chan1.close(); chan2.close(); }); children.go(async delegate() { while (true) { chan_recv_wrap <int> res = await chan1.receive(); if (res.state == chan_state.closed) { Log($"chan1 已关闭"); break; } Log($"recv1 {res.msg}"); } }); children.go(async delegate() { while (true) { chan_recv_wrap <int> res = await chan2.receive(); if (res.state == chan_state.closed) { Log($"chan2 已关闭"); break; } Log($"recv2 {res.msg}"); } }); await children.wait_all(); }
//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(); }