コード例 #1
0
        /// <inheritdoc />
        public OperationState Send(IRequest request, Action <IRequestError, Response> callback, int timeoutMillis)
        {
            if (_isCanceled)
            {
                // Avoid calling back before returning
                Task.Factory.StartNew(() => callback(RequestError.CreateClientError(new SocketException((int)SocketError.NotConnected), true), null),
                                      CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
                return(null);
            }

            IncrementInFlight();

            var state = new OperationState(
                callback,
                request,
                timeoutMillis,
                _connectionObserver.CreateOperationObserver()
                );

            _writeQueue.Enqueue(state);

            if (state.TimeoutMillis > 0)
            {
                // timer can be disposed while connection cancellation hasn't been invoked yet
                try
                {
                    var requestTimeout = Configuration.Timer.NewTimeout(OnTimeout, state, state.TimeoutMillis);
                    state.SetTimeout(requestTimeout);
                }
                catch (Exception ex)
                {
                    // Avoid calling back before returning
                    Task.Factory.StartNew(() => callback(RequestError.CreateClientError(ex, true), null),
                                          CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
                    return(null);
                }
            }

            RunWriteQueue();
            return(state);
        }
コード例 #2
0
        /// <inheritdoc />
        public OperationState Send(IRequest request, Action <IRequestError, Response> callback, int timeoutMillis)
        {
            if (_isCanceled)
            {
                // Avoid calling back before returning
                Task.Factory.StartNew(() => callback(RequestError.CreateClientError(new SocketException((int)SocketError.NotConnected), true), null),
                                      CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
                return(null);
            }

            IncrementInFlight();

            var state = new OperationState(
                callback,
                request,
                timeoutMillis,
                _connectionObserver.CreateOperationObserver()
                );

            _writeQueue.Enqueue(state);
            RunWriteQueue();
            return(state);
        }