// todo request cache public virtual Task <DataContent> HandleDataAsync(IResolverSession session, DataContent dataContent, CancellationToken cancellationToken) { var stop = ProtocolWatch.Start("send-request"); var taskSource = new TaskCompletionSource <DataContent>(); Monitor.Enter(this); try { ThrowClosed(); var requestId = lastRequestId++; var requestHeader = new RequestHeader() { RequestId = requestId, CanBeCached = false, RequestType = RequestType.Request, RezervedFlag = 0 }; var index = PrepareSendData(sendBuffer, requestHeader, dataContent); responses[requestId] = taskSource; cancellationToken.Register(() => { if (responses.TryRemove(requestId, out var tcs)) { tcs.TrySetCanceled(); } }); packetStream.WritePacket(sendBuffer, index, false); } catch (Exception e) { OnClosed(e); throw; } finally { Monitor.Exit(this); stop(); } return(taskSource.Task); }