예제 #1
0
        private async Task <NetworkResponse> Api_PerformMessage2(NetworkRequest request, CancellationToken cancellationToken)
        {
            _ = request ?? throw new ArgumentNullException(nameof(request));
            long id;

            lock (nextIdLock)
                id = nextId++;
            request.Token  = id;
            using var call = new Call(id, cancellationToken, request);
            calls.TryAdd(id, call);
            EnqueueNewMessage?.Invoke(call.Request);
            try { await call.Wait(); }
            catch (TaskCanceledException) { }
            calls.TryRemove(id, out _);
            if (call.UserToken.IsCancellationRequested)
            {
                NotifyRequestCancelled?.Invoke(call.Id);
                throw new TaskCanceledException();
            }
            return(call.Response ?? throw new TaskCanceledException());
        }
예제 #2
0
 private void Manager_EnqueueNewMessage(NetworkRequest request)
 {
     _ = request ?? throw new ArgumentNullException(nameof(request));
     EnqueueMessage(request);
 }
예제 #3
0
 private Task <NetworkResponse> Api_PerformMessage(NetworkRequest request)
 => Api_PerformMessage2(request, CancellationToken.None);