public Task <object> Request(object requestMessage) { Hub.ProtoExtensions.Request r; lock (reqRnd) { r = new Request { Payload = requestMessage, RequestId = $"{mode}_{reqRnd.Next(25000)}_{DateTime.Now.Ticks}", Identity = (userProvider?.CurrentIdentity != null) ? JsonHelper.ToJsonStrongTyped(userProvider.CurrentIdentity) : null }; } return(AsyncExtensions.CancelAfterAsync((c) => { OperationWaitHandle wh = new OperationWaitHandle(); waitingOperations.TryAdd(r.RequestId, wh); try { Write(r); } catch (Exception ex) { waitingOperations.TryRemove(r.RequestId, out _); if (!wh.ServerResponse.Task.IsCompleted) { wh.ServerResponse.SetException(ex); } } return wh.ServerResponse.Task; }, TimeSpan.FromSeconds(10), t => { waitingOperations.TryRemove(r.RequestId, out _); })); }