public async void SendAsync(JT809Response jT809Response) { if (disposed) { return; } if (channel == null) { throw new NullReferenceException("Channel Not Open"); } if (jT809Response == null) { throw new ArgumentNullException("Data is null"); } try { if (channel.Open && channel.Active) { manualResetEvent.Pause(); await channel.WriteAndFlushAsync(jT809Response); } else { manualResetEvent.Reset(); _ = Policy.HandleResult(channel.Open && channel.Active) .WaitAndRetryForeverAsync(retryAttempt => { return(TimeSpan.FromSeconds(10)); }, (exception, timespan, ctx) => { logger.LogError($"服务端断开{channel.RemoteAddress},重试结果{exception.Result},重试次数{timespan},下次重试间隔(s){ctx.TotalSeconds}"); }) .ExecuteAsync(async() => { channel = await bootstrap.ConnectAsync(iPEndPoint); var package = Protocol.Enums.JT809BusinessType.主链路登录请求消息.Create(_jT809_0x1001); await channel.WriteAndFlushAsync(new JT809Response(package, 256)); logger.LogInformation("尝试重连,等待登录应答结果..."); manualResetEvent.Pause(); return(await Task.FromResult(channel.Open && channel.Active)); }); } } catch (ClosedChannelException ex) { logger.LogError(ex.Message); } }