//16 超时发送 static async Task Worker16() { chan <int> chan = chan <int> .make(0);//无缓存 generator.children children = new generator.children(); children.go(async delegate() { for (int i = 0; ; i++) { chan_send_wrap res = await chan.timed_send(2000, i); if (res.state == chan_state.overtime) { Log($"send 超时"); break; } await generator.sleep(1000); } }); children.go(async delegate() { for (int i = 0; i < 3; i++) { chan_recv_wrap <int> res = await chan.receive(); Log($"recv0 {res.msg}"); } }); await children.wait_all(); }
//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 IEnumerable <goroutinewrapper> NewTimer(chan endFlag, float t) { var start = DateTime.Now; var timeAdd = 0; Console.WriteLine("计时开始...0"); for (;;) { if (TimeSince(start) > timeAdd) { timeAdd = TimeSince(start); if (TimeSince(start) % 500 == 0) { Console.WriteLine("计时中..." + TimeSince(start)); } } if (TimeSince(start) > t) { yield return(goroutine.写(endFlag, TimeSince(start))); break; } yield return(null); } }
public static goroutinewrapper 读(chan o) { var r = new goroutinewrapper(); r.inner = o; r.readOrWrite = true; return(r); }
public static goroutinewrapper 写(chan o, object obj) { var r = new goroutinewrapper(); r.inner = o; r.inner.Val = obj; r.readOrWrite = false; return(r); }
//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(); }
//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 void Main(string[] args) { work_service work = new work_service(); _strand = new work_strand(work); _chan1 = chan <long> .make(_strand, 3); _chan2 = chan <long> .make(_strand, 0); _chan3 = chan <long> .make(_strand, -1); _csp = new csp_chan <long, long>(_strand); generator.go(_strand, Producer1); generator.go(_strand, Producer2); generator.go(_strand, Producer3); generator.go(_strand, Producer4); generator.go(_strand, Consumer); generator.go(_strand, () => Producer5(generator.tgo(_strand, Consumer2))); work.run(); }
static IEnumerable<goroutinewrapper> NewTimer(chan endFlag, float t) { var start = DateTime.Now; var timeAdd = 0; Console.WriteLine("计时开始...0"); for (;;) { if (TimeSince(start) > timeAdd) { timeAdd = TimeSince(start); if (TimeSince(start) % 500 == 0) Console.WriteLine("计时中..." + TimeSince(start)); } if (TimeSince(start) > t) { yield return goroutine.写(endFlag, TimeSince(start)); break; } yield return null; } }
//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(); }
static IEnumerable<goroutinewrapper> afterTimer(chan endFlag) { yield return goroutine.读(endFlag); Console.WriteLine("时间到达:{0}", endFlag.Val); }
public static chan make() { var r = new chan(); return(r); }
public static chan make() { var r = new chan(); return r; }
public static goroutinewrapper 读(chan o) { var r = new goroutinewrapper(); r.inner = o; r.readOrWrite = true; return r; }
public static goroutinewrapper 写(chan o, object obj) { var r = new goroutinewrapper(); r.inner = o; r.inner.Val = obj; r.readOrWrite = false; return r; }
static IEnumerable <goroutinewrapper> afterTimer(chan endFlag) { yield return(goroutine.读(endFlag)); Console.WriteLine("时间到达:{0}", endFlag.Val); }