示例#1
0
        /// <summary>
        ///     Send解析任务完成通知
        /// </summary>
        /// <param name="protocol"></param>
        /// <param name="context"></param>
        /// <param name="schedulerRunTime">rx处理时间</param>
        /// <returns></returns>
        public static async Task WaitingSendResult(this IProtocol protocol, CommTaskContext context,
                                                   int schedulerRunTime = 100)
        {
            var state = 0; //等待中..

            var dis = protocol.History
                      .TakeUntil(DateTimeOffset.Now.AddMilliseconds(context.Timeout + schedulerRunTime))
                      .FirstOrDefaultAsync(p => ((CommTaskContext)p).Id == context.Id)
                      .ObserveOn(TaskPoolScheduler.Default)
                      .Subscribe(p => { state = p == null ? 1 : 2; });

            await protocol.SendAsync(context).ConfigureAwait(false);

            while (state == 0)
            {
                await Task.Delay(10).ConfigureAwait(false);
            }

            dis.Dispose();

            if (state == 1)
            {
                throw new Exception($"Send Result Lost. {nameof(CommTaskContext.Id)}:{context.Id}");
            }
        }
示例#2
0
        public async Task WaitingSendResultTest()
        {
            var simulator   = new ProtocolSimulator(0, 3000);
            var disposables = new CompositeDisposable();
            var msg         = new List <string>();
            var rst         = new List <CommContext>();

            simulator.Received.Select(p => $"@ {DateTime.Now:mm:ss fff} 接收 : {p.ByteToHex()}")
            .Subscribe(p => msg.Add(p))
            .DisposeWith(disposables);
            simulator.History.Subscribe(p =>
            {
                msg.Add($"@ {DateTime.Now:mm:ss fff} {p}");
                rst.Add(p);
            })
            .DisposeWith(disposables);

            await simulator.OpenAsync();

            //有返回值
            var ctx1 = new CommTaskContext("1", "AA01BB", "AA$1BB", 1000 + 3000);

            var begin = DateTime.Now;

            _ = simulator.SendAsync(ctx1);
            await simulator.WaitingSendResult(ctx1, 1000 + 3000);

            var end = DateTime.Now;

            ctx1.Response.Value.Should().Be("AA01BB");
            (end - begin).TotalMilliseconds.Should().BeApproximately(3500, 500);
            rst.TrueForAll(p => p.State == CommContextState.Success);

            rst.Clear();

            //无返回值
            var ctx2 = new CommTaskContext("2", "000000");

            _ = simulator.SendAsync(ctx2);
            await simulator.WaitingSendResult(ctx2, 3000 + 3000);

            ctx2.State.Should().Be(CommContextState.NoNeed);

            await simulator.CloseAsync();

            simulator.Dispose();
            disposables.Dispose();
        }