Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
        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();
            }
        }