コード例 #1
0
        public void TestMaxPendingLimit()
        {
            TaskCompletionSource <bool> serverBlocker = new TaskCompletionSource <bool>();
            var serverMessages = 0;

            LeanIPC.RequestHandler serverHandler = async(message) =>
            {
                System.Threading.Interlocked.Increment(ref serverMessages);
                await serverBlocker.Task;

                if (message.Arguments == null || message.Arguments.Length == 0)
                {
                    return(RequestHandlerResponse.FromResult((object)null));
                }

                return(new RequestHandlerResponse(message.Types, message.Arguments));
            };

            using (var setup = new ClientServerTester(serverHandler, EchoMethod))
            {
                setup.Client.MaxPendingRequests = 10;
                var sendTasks = Enumerable
                                .Range(0, 20)
                                .Select(x =>
                                        setup.GuardedOperationAsync(() => setup.Client.SendAndWaitAsync <int, int>(x))
                                        )
                                .ToArray();

                // Make sure the requests have propagated
                System.Threading.Thread.Sleep(1000);
                if (serverMessages != setup.Client.MaxPendingRequests)
                {
                    throw new Exception($"Server got {serverMessages} messages but the pending limit is {setup.Client.MaxPendingRequests}");
                }

                // Trigger a resend
                setup.Client.MaxPendingRequests = 15;
                System.Threading.Thread.Sleep(1000);
                if (serverMessages != setup.Client.MaxPendingRequests)
                {
                    throw new Exception($"Server got {serverMessages} messages but the pending limit is {setup.Client.MaxPendingRequests}");
                }

                // Trigger a no-op resend
                setup.Client.MaxPendingRequests = 10;
                System.Threading.Thread.Sleep(1000);
                if (serverMessages != 15)
                {
                    throw new Exception($"Server got {serverMessages} messages but the pending limit is {15}");
                }

                serverBlocker.TrySetResult(true);

                Task.WhenAll(sendTasks).Wait();
                if (serverMessages != 20)
                {
                    throw new Exception($"Server got {serverMessages} messages but should have {12}");
                }
            }
        }
コード例 #2
0
        private static Task <RequestHandlerResponse> EchoMethod(ParsedMessage message)
        {
            if (message.Arguments == null || message.Arguments.Length == 0)
            {
                return(Task.FromResult(RequestHandlerResponse.FromResult((object)null)));
            }

            return(Task.FromResult(new RequestHandlerResponse(message.Types, message.Arguments)));
        }