/// <summary> /// 单向发送消息到服务器 /// </summary> /// <param name="msg">消息数据</param> /// <param name="timeout">超时时长(毫秒)</param> /// <returns></returns> public async Task SendOneWayAsync(DotNettyData msg, int timeout = 30000) { var request = requestManager.CreateRequest(timeout, msg.SerialNumber); await channel.WriteAndFlushAsync(msg); await request.Task; }
protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg) { ThreadPool.QueueUserWorkItem((object state) => { try { byte[] bytes = (byte[])state; DotNettyData result = (DotNettyData)ByteExtension.ByteArrayToObject(bytes); requestManager.CompleteRequest(result.SerialNumber, result); } catch (Exception ex) { LogsManager.Error("处理服务端结果失败"); } }, msg); }
/// <summary> /// 请求完成 /// </summary> /// <param name="requestId">RequestId</param> /// <param name="result">承载请求响应的消息对象</param> public void CompleteRequest(string requestId, DotNettyData result) { if (!requestList.TryRemove(requestId, out RequestInfo request)) { return; } try { request.CancellationTokenSource.Dispose(); request.TaskCompletionSource.SetResult(result); LogsManager.Debug($"Request completed. Request={request.Id}"); } catch (Exception ex) { LogsManager.Error(ex, $"Request has error. ExceptionMessage={ex.Message}"); } }
/// <summary> /// 发送消息到服务器 /// </summary> /// <param name="msg">消息数据</param> /// <param name="continueOnCapturedContext">配置用于等待此 System.Threading.Tasks.Task`1的 awaiter。</param> /// <param name="timeout">超时时长(毫秒)</param> /// <returns></returns> public async Task <DotNettyData> SendAsync(DotNettyData msg, bool continueOnCapturedContext = true, int timeout = 30000) { var request = requestManager.CreateRequest(timeout, msg.SerialNumber); try { await channel.WriteAndFlushAsync(msg).ConfigureAwait(continueOnCapturedContext); } catch (AggregateException ex) { if (ex.InnerException is ClosedChannelException || ex.InnerException is SocketException) { throw new NetworkException(host, port, ex.InnerException.Message); } throw ex; } var result = await request.Task; return(result); }
protected override void ChannelRead0(IChannelHandlerContext context, byte[] bytes) { DotNettyData data = (DotNettyData)ByteExtension.ByteArrayToObject(bytes); if (serviceRecieveHandler != null && data != null) { Task.Run(() => { try { var handlerResult = serviceRecieveHandler(data); if (handlerResult != null) { context.WriteAndFlushAsync(handlerResult); } } catch (Exception ex) { //ex.Error(); } }); } }