/// <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}"); } }
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(); }