public async Task <T> Enqueue <T>(Func <Task <T> > taskGenerator) { if (_isDisposed) { throw new ObjectDisposedException(nameof(TaskQueue)); } await _semaphore.EnterAsync(); if (_isDisposed) { throw new ObjectDisposedException(nameof(TaskQueue)); } try { return(await taskGenerator()); } finally { _semaphore.Release(); } }
private async void HandleEventAction(NetworkEventInfo eventInfo, object parameter) { if (_isDisposed) { return; } //RETURN: //HEAD - byte - response type //HEAD - uinteger - event id //(BODY - integer - body length) //(BODY - body length - the serialized object) var dataLength = 1 /* response type */ + 4 /* event id */; if (parameter != null) { dataLength += 4 /* length */; } var takenBuffer = Cache.Pool.Rent(dataLength + EstimatedEventParameterSize + CustomOffset); var data = takenBuffer; int parameterLength; if (parameter != null) { parameterLength = _serializer.Serialize(eventInfo.EventArgsType, ref data, CustomOffset + 9, parameter, Cache.Pool); if (data != takenBuffer) { Cache.Pool.Return(takenBuffer); } data[CustomOffset] = (byte)NetworkCallResponse.TriggerEventWithParameter; BinaryUtils.WriteInt32(data, CustomOffset + 5, parameterLength); } else { parameterLength = 0; data[CustomOffset] = (byte)NetworkCallResponse.TriggerEvent; } BinaryUtils.WriteUInt32(data, CustomOffset + 1, eventInfo.EventId); Task eventLockTask; lock (_disposedLock) { if (_isDisposed) { Cache.Pool.Return(data); return; } eventLockTask = _eventLock.EnterAsync(); } //keep event order await eventLockTask; try { await OnSendData(new BufferSegment(data, CustomOffset, dataLength + parameterLength, Cache.Pool)); } finally { _eventLock.Release(); } }