private void InvokeOneWayMethod(IRequestContext context, object[] args, ContextChain chain) { Task.Run(() => { // invoke method var invokeFuture = InvokeMethod(context, args); invokeFuture.ContinueWith(t => { if (t.Exception != null) { _logger.LogError(new EventId(0, "Thrift"), t.Exception, $"An error occurred execute method {_method.Name}[{_method.DeclaringType?.FullName}]."); } chain.Done(); }); }); }
public Task <Boolean> Process(TProtocol inProtocol, TProtocol outProtocol, int sequenceId, ContextChain contextChain) { // read args contextChain.PreRead(); Object[] args = ReadArguments(inProtocol); contextChain.PostRead(args); IRequestContext requestContext = RequestContexts.GetCurrentContext(); inProtocol.ReadMessageEnd(); if (!_oneway) { // invoke method var invokeFuture = InvokeMethod(requestContext, args); return(CompleteMethodInvoke(invokeFuture, outProtocol, sequenceId, contextChain, requestContext).ContinueWith(t => { contextChain.Done(); return t.Result; })); } else { InvokeOneWayMethod(requestContext, args, contextChain); //完全不用处理,因为客户端没有记录 oneway 的 sequence id,处理反而造成麻烦。 //try //{ // WriteResponse(outProtocol, // sequenceId, // TMessageType.Reply, // "success", // (short)0, // _successCodec, // null); //} //catch (Exception e) //{ // TaskCompletionSource<Boolean> resultFuture = new TaskCompletionSource<bool>(); // resultFuture.TrySetException(e); // return resultFuture.Task; //} return(Task.FromResult(true)); } }