public virtual Task <Message> ExecuteOperation(OperationContext context) { int requestId = Interlocked.Increment(ref _requestId); context.Message.AttachHeader(new OperationHeader(requestId, OperationType.Request)); var continuation = new PendingOperation(requestId); if (!PendingOperationsByRequestId.TryAdd(requestId, continuation)) { throw new Exception("This could happen only if requestId is duplicated"); } var expiration = Task.Delay(TimeSpan.FromSeconds(ExpirationTimeout), continuation.Expiration.Token); expiration.ContinueWith((_) => { PendingOperation dummy; if (PendingOperationsByRequestId.TryRemove(continuation.RequestId, out dummy)) { continuation.TCS.SetException(new Exception(string.Format("ExecuteOperation<{0}, {1}> has Expired after {2} sec", requestId, context.Message, ExpirationTimeout))); } }); Log.Debug("Sending " + context.Message); Channel.Send(context.Message); MessageFactory.Free(context.Message); return(continuation.TCS.Task); }