private void OnDataAvailable(IAsyncResult result) { DataAvailableCallback callback = (DataAvailableCallback)result.AsyncState; Exception readException = null; try { // complete read operation _readPos = 0; _dataCount = _stream.EndRead(result); if (_dataCount <= 0) { readException = new IOException("No data available"); } } catch (Exception ex) { // unable to read data, connection is broken? readException = ex; } // invoke client callback callback(readException, _dataAvailableState); }
private void InvokeCallback(object state) { // invoke client callback DataAvailableCallback callback = (DataAvailableCallback)state; callback(null, _dataAvailableState); }
public void BeginRead(byte[] data, DataAvailableCallback callback) { if (_isClosed) { return; } _isReading = true; beginRead(data, (d, l) => onDataRead(d, l, callback)); }
private void onDataRead(byte[] data, int length, DataAvailableCallback callback) { _isReading = false; if (_isClosed) { return; } try { callback(data, length); } catch (IOException ex) { Log.Error("DataStream.onDataRead: {0}", ex.ToString()); } }
public RequestQueue(int maxQueueSize, int queueTimeout, int maxActiveWorkItems, int minFreeThreads) { // parameters validation if (maxQueueSize < 1) throw new ArgumentOutOfRangeException("maxQueueSize"); if (queueTimeout < 1) throw new ArgumentOutOfRangeException("minFreeThreads"); if (maxActiveWorkItems < 1) throw new ArgumentOutOfRangeException("maxActiveWorkItems"); _maxRequestQueueSize = maxQueueSize; _queueTimeout = TimeSpan.FromSeconds(queueTimeout); _maxWorkItemsCount = maxActiveWorkItems; _minFreeThreads = minFreeThreads; _requestAvailableCallback = OnDataAvailable; _workItemCallback = OnNewWorkItem; }
/// <summary> /// Asynchronously reads data from stream to fill buffer /// </summary> public void FillBuffer(DataAvailableCallback callback, object state) { if (_dataCount > 0) { // schedule client callback execution _dataAvailableState = state; ThreadPool.QueueUserWorkItem(new WaitCallback(InvokeCallback), callback); } else { if (_writePos > 0) { // flush buffered data to the stream FlushWrite(); } // begin read operation _dataAvailableState = state; _stream.BeginRead(_buffer, 0, _bufferSize, _dataAvailableCallback, callback); } }
public RequestQueue(int maxQueueSize, int queueTimeout, int maxActiveWorkItems, int minFreeThreads) { // parameters validation if (maxQueueSize < 1) { throw new ArgumentOutOfRangeException("maxQueueSize"); } if (queueTimeout < 1) { throw new ArgumentOutOfRangeException("minFreeThreads"); } if (maxActiveWorkItems < 1) { throw new ArgumentOutOfRangeException("maxActiveWorkItems"); } _maxRequestQueueSize = maxQueueSize; _queueTimeout = TimeSpan.FromSeconds(queueTimeout); _maxWorkItemsCount = maxActiveWorkItems; _minFreeThreads = minFreeThreads; _requestAvailableCallback = new DataAvailableCallback(OnDataAvailable); _workItemCallback = new WaitCallback(OnNewWorkItem); }
/// <summary> /// Asynchronously reads data from stream to fill buffer /// </summary> public void FillBuffer(DataAvailableCallback callback, object state) { if (_dataCount > 0) { // schedule client callback execution _dataAvailableState = state; ThreadPool.QueueUserWorkItem(InvokeCallback, callback); } else { if (_writePos > 0) { // flush buffered data to the stream FlushWrite(); } // begin read operation _dataAvailableState = state; _stream.BeginRead(_buffer, 0, BufferSize, _dataAvailableCallback, callback); } }
internal static extern bool RegisterOnDataFromDataChannelReady( IntPtr connection, DataAvailableCallback callback);
protected abstract void beginRead(byte[] data, DataAvailableCallback callback);
public void BeginReceive(DataAvailableCallback callback, object state) { // begin asynchronous receive operation _bufferedStream.FillBuffer(callback, state); }
/// <inheritdoc/> protected override void beginRead(byte[] data, DataAvailableCallback callback) { _buffer = data; _stream.BeginRead(_buffer, 0, _buffer.Length, dataAvailable, callback); }