コード例 #1
0
ファイル: TaskQueue.cs プロジェクト: anobaka/TaskQueue
        private async Task _executeTask(TaskData taskData)
        {
            if (!taskData.ExecuteImmediately)
            {
                await Task.Delay(_options.Value.Interval);
            }

            await Handler.Handle(taskData);

            Interlocked.Decrement(ref _threadCount);
            if (PoolThreadManager != null)
            {
                await PoolThreadManager.Release();
            }
        }
コード例 #2
0
ファイル: TaskQueue.cs プロジェクト: anobaka/TaskQueue
        public virtual async Task Start()
        {
            var canStart = false;

            lock (_lock)
            {
                if (!Running)
                {
                    Running  = true;
                    canStart = true;
                }
            }

            if (canStart)
            {
                while (Running)
                {
                    TaskData data = null;
                    lock (_lock)
                    {
                        //todo: the sort of queue data is not stable for now.
                        if (_threadCount < _options.Value.MaxThreads && TryDequeue(out data))
                        {
                            if (PoolThreadManager == null || PoolThreadManager.Lock().ConfigureAwait(false)
                                .GetAwaiter().GetResult())
                            {
                                Interlocked.Increment(ref _threadCount);
                            }
                            else
                            {
                                Enqueue(data);
                            }
                        }
                    }

                    if (data != null)
                    {
                        // Execute asynchronously.
                        _executeTask(data);
                    }
                    else
                    {
                        // Avoid unnecessary cpu usage.
                        await Task.Delay(1);
                    }
                }
            }
        }
コード例 #3
0
ファイル: TaskQueuePool.cs プロジェクト: bing-copy/TaskQueue
        private async void _executeTask(TaskQueue task, TaskData taskData)
        {
            if (!taskData.ExecuteImmediately)
            {
                await Task.Delay(Math.Max(_options.MinInterval, task.Options.Interval));
            }
            var newTaskData = await task.ExecuteAsync(taskData);

            if (_status == TaskQueuePoolStatus.Running && newTaskData?.Any() == true)
            {
                foreach (var d in newTaskData)
                {
                    Enqueue(d);
                }
            }
            Interlocked.Decrement(ref _currentThreadCount);
            Interlocked.Decrement(ref task.CurrentThreadCount);
        }
コード例 #4
0
ファイル: TaskQueuePool.cs プロジェクト: bing-copy/TaskQueue
 public void Enqueue(TaskData taskData)
 {
     Interlocked.Increment(ref _queuedTaskDataCount);
     _queuedTaskData.Enqueue(taskData);
 }
コード例 #5
0
ファイル: TaskQueue.cs プロジェクト: bing-copy/TaskQueue
 public abstract bool OnException(TaskData taskData, Exception e);
コード例 #6
0
ファイル: TaskQueue.cs プロジェクト: bing-copy/TaskQueue
 public abstract bool MatchedTaskData(TaskData taskData);
コード例 #7
0
ファイル: TaskQueue.cs プロジェクト: bing-copy/TaskQueue
 public abstract Task <List <TaskData> > ExecuteAsync(TaskData taskData);
コード例 #8
0
 public virtual bool CanHandle(TaskData data)
 {
     return(data is TTaskData);
 }
コード例 #9
0
 protected virtual Task OnException(TaskData data, Exception e) => Task.CompletedTask;