internal async Task <GenericCommand> SendRequest(GenericCommand request) { if (IsIdempotentCommand(request)) { GenericCommand sendingReq = requestToResponses.Keys.FirstOrDefault(item => { // TRICK 除了 I 其他字段相等 request.I = item.I; return(Equals(request, item)); }); if (sendingReq != null) { LCLogger.Warn("duplicated request"); if (requestToResponses.TryGetValue(sendingReq, out TaskCompletionSource <GenericCommand> waitingTcs)) { return(await waitingTcs.Task); } LCLogger.Error($"error request: {request}"); } } TaskCompletionSource <GenericCommand> tcs = new TaskCompletionSource <GenericCommand>(); request.I = requestI++; requestToResponses.Add(request, tcs); try { await SendCommand(request); } catch (Exception e) { tcs.TrySetException(e); } return(await tcs.Task); }