/// <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); }
/// <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); }