コード例 #1
0
        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);
        }