Exemplo n.º 1
0
        //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();
        }
Exemplo n.º 2
0
        //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();
        }
Exemplo n.º 3
0
    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);
        }
    }
Exemplo n.º 4
0
    public static goroutinewrapper 读(chan o)
    {
        var r = new goroutinewrapper();

        r.inner       = o;
        r.readOrWrite = true;
        return(r);
    }
Exemplo n.º 5
0
    public static goroutinewrapper 写(chan o, object obj)
    {
        var r = new goroutinewrapper();

        r.inner       = o;
        r.inner.Val   = obj;
        r.readOrWrite = false;
        return(r);
    }
Exemplo n.º 6
0
        //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();
        }
Exemplo n.º 7
0
        //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();
        }
Exemplo n.º 8
0
        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();
        }
Exemplo n.º 9
0
 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;
     }
 }
Exemplo n.º 10
0
        //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();
        }
Exemplo n.º 11
0
 static IEnumerable<goroutinewrapper> afterTimer(chan endFlag)
 {
     yield return goroutine.读(endFlag);
     Console.WriteLine("时间到达:{0}", endFlag.Val);
 }
Exemplo n.º 12
0
    public static chan make()
    {
        var r = new chan();

        return(r);
    }
Exemplo n.º 13
0
 public static chan make()
 {
     var r = new chan();
     return r;
 }
Exemplo n.º 14
0
 public static goroutinewrapper 读(chan o)
 {
     var r = new goroutinewrapper();
     r.inner = o;
     r.readOrWrite = true;
     return r;
 }
Exemplo n.º 15
0
 public static goroutinewrapper 写(chan o, object obj)
 {
     var r = new goroutinewrapper();
     r.inner = o;
     r.inner.Val = obj;
     r.readOrWrite = false;
     return r;
 }
Exemplo n.º 16
0
    static IEnumerable <goroutinewrapper> afterTimer(chan endFlag)
    {
        yield return(goroutine.读(endFlag));

        Console.WriteLine("时间到达:{0}", endFlag.Val);
    }