コード例 #1
0
ファイル: AsyncSerialExecutor.cs プロジェクト: justmine66/MDA
        private async Task ExecuteNextAsync()
        {
            while (!_actions.IsEmpty)
            {
                var gotLock = false;
                try
                {
                    if (!(gotLock = _locker.TryGetLock()))
                    {
                        return;
                    }

                    while (!_actions.IsEmpty)
                    {
                        if (!_actions.TryDequeue(out var actionTuple))
                        {
                            continue;
                        }

                        try
                        {
                            var result = await actionTuple.Item2();

                            actionTuple.Item1.TrySetResult(result);
                        }
                        catch (Exception exc)
                        {
                            actionTuple.Item1.TrySetException(exc);
                        }
                    }
                }
                finally
                {
                    if (gotLock)
                    {
                        _locker.ReleaseLock();
                    }
                }
            }
        }
コード例 #2
0
        private async Task ExecuteNext()
        {
            while (!actions.IsEmpty)
            {
                bool gotLock = false;
                try
                {
                    if (!(gotLock = locker.TryGetLock()))
                    {
                        return;
                    }

                    while (!actions.IsEmpty)
                    {
                        Tuple <TaskCompletionSource <TResult>, Func <Task <TResult> > > actionTuple;
                        if (actions.TryDequeue(out actionTuple))
                        {
                            try
                            {
                                TResult result = await actionTuple.Item2();

                                actionTuple.Item1.TrySetResult(result);
                            }
                            catch (Exception exc)
                            {
                                actionTuple.Item1.TrySetException(exc);
                            }
                        }
                    }
                }
                finally
                {
                    if (gotLock)
                    {
                        locker.ReleaseLock();
                    }
                }
            }
        }