示例#1
0
        public static Task <bool> Before(this Task primary, TimeSpan timeout, params CancellationToken[] tokens)
        {
            var localTCS = new TaskCompletionSource();

            foreach (var token in tokens)
            {
                token.Register(localTCS.SetResult);
            }
            CancellationTokenHelpers.Timeout(timeout).Token.Register(localTCS.SetResult);
            return(Task.WhenAny(primary, localTCS.Task).ContinueWith(t => { return (primary.Status == TaskStatus.RanToCompletion); }));
        }
        public async Task Should_receive_multiple_packets()
        {
            TcpTransport transport = CreateTcpTransport();

            var receivedMessages = new AsyncProducerConsumerQueue <byte[]>();

            transport.Subscribe(receivedMessages.Enqueue);

            await transport.ConnectAsync();

            Socket clientSocket = _serverSocket.Accept();

            byte[] payload1 = Enumerable.Range(0, 10).Select(i => (byte)i).ToArray();
            var    packet1  = new TcpTransportPacket(0, payload1);

            byte[] payload2 = Enumerable.Range(11, 40).Select(i => (byte)i).ToArray();
            var    packet2  = new TcpTransportPacket(1, payload2);

            byte[] payload3 = Enumerable.Range(51, 205).Select(i => (byte)i).ToArray();
            var    packet3  = new TcpTransportPacket(2, payload3);

            byte[] allData = ArrayUtils.Combine(packet1.Data, packet2.Data, packet3.Data);

            byte[] dataPart1;
            byte[] dataPart2;
            allData.Split(50, out dataPart1, out dataPart2);

            clientSocket.Send(dataPart1);
            await Task.Delay(100);

            clientSocket.Send(dataPart2);
            await Task.Delay(100);

            byte[] receivedData1 = await receivedMessages.DequeueAsync(CancellationTokenHelpers.Timeout(1000).Token);

            receivedData1.Should().BeEquivalentTo(payload1);

            byte[] receivedData2 = await receivedMessages.DequeueAsync(CancellationTokenHelpers.Timeout(1000).Token);

            receivedData2.Should().BeEquivalentTo(payload2);

            byte[] receivedData3 = await receivedMessages.DequeueAsync(CancellationTokenHelpers.Timeout(1000).Token);

            receivedData3.Should().BeEquivalentTo(payload3);

            await transport.DisconnectAsync();

            clientSocket.Close();
        }