Esempio n. 1
0
        public void ContinuationPassingTest()
        {
            var client = BinarySessionChannel <Request <int, Respond <double, Close> > > .Fork
                         (
                server =>
            {
                server.Receive((s1, v) => s1.Send(Math.Sqrt(v), s2 => s2.Close()));
            }
                         );

            double result = default;

            client.Send
                (10, c1 =>
            {
                c1.Receive(
                    (c2, v) =>
                {
                    result = v;
                    c2.Close();
                }
                    );
            }
                );
            Assert.Equal(Math.Sqrt(10), result);
        }
Esempio n. 2
0
        /// <summary>
        /// 分岐・再帰のある通信
        /// サーバーはクライアントから整数を受け取り対応するFizzBuzzゲームの回答を返す
        /// クライアントが満足するまで繰り返す
        /// </summary>
        private static async Task Example3(int n)
        {
            var client = BinarySessionChannel <Cons <Request <int, Respond <string, RequestChoice <Jump <Zero>, Close> > >, Nil> > .Fork(async server =>
            {
                // サーバースレッドの処理
                var s1 = server.Enter();
                while (true)
                {
                    var(s2, i) = await s1.ReceiveAsync();
                    var str    = Mod(i, 3) == 0 ? (Mod(i, 5) == 0 ? "FizzBuzz" : "Fizz") : (Mod(i, 5) == 0 ? "Buzz" : $"{i}");
                    var s3     = s2.Send(str);
                    bool l     = false;
                    await s3.FollowAsync(
                        left =>
                    {
                        l  = true;
                        s1 = left.Zero();
                        // TODO 本当はここからループはじめに飛びたい
                    },
                        right =>
                    {
                    });
                    // TODO
                    if (!l)
                    {
                        break;
                    }
                }
            });

            // クライアント側の処理
            int j  = 1;
            var c1 = client.Enter();

            while (true)
            {
                var c2 = c1.Send(j);
                var(c3, s) = await c2.ReceiveAsync();

                Console.WriteLine(s);
                if (j == n)
                {
                    c3.ChooseRight();
                    break;
                }
                c1 = c3.ChooseLeft().Zero();
                j++;
            }
        }