C# 可指定并行度任务调度器
可指定并行度的任务调度器
///
/// 指定最大并行度的任务调度器
///
public class SpecifyDegreeOfParallelismTaskScheduler : TaskScheduler
{
///
/// 信号量锁
///
private static System.Threading.SemaphoreSlim _lock = new System.Threading.SemaphoreSlim(1);
///
/// 当前线程是否正在处理任务
///
[ThreadStatic]
private static bool _currentThreadIsProcessingItems;
///
/// 执行的任务队列
///
private readonly LinkedList
///
/// 指定的最大并行度
///
private readonly int _maxDegressOfParallelism;
///
///当前调度器中正在执行的任务数
///
private int _runingTasks = 0;
///
/// 指示此调度器能够支持的最大并发级别。
///
public override int MaximumConcurrencyLevel { get { return this._maxDegressOfParallelism; } }
///
/// 初始化一个可指定最大并行度的任务调度器
///
/// 最大并行度
public SpecifyDegreeOfParallelismTaskScheduler(int maxDegreeOfParallelism)
{
if (maxDegreeOfParallelism < 1)
throw new ArgumentOutOfRangeException("maxDegreeOfParallelism至少为1");
this._maxDegressOfParallelism = maxDegreeOfParallelism;
}
///
/// 将Task排队到调度器中
///
/// 要排队的任务
protected override void QueueTask(Task task)
{
_lock.Wait();
try
{
this._tasks.AddLast(task);
if (this._runingTasks < this._maxDegressOfParallelism)
{
++this._runingTasks;
ConsumeTaskOfPending();
}
}
finally
{
_lock.Release();
}
}
///
/// 尝试在当前线程上执行指定的任务
///
/// 被执行的任务
/// 指定的任务之前是否已经排队
///
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
//如果当前前程没有正在处理项目,无法内联
if (!_currentThreadIsProcessingItems)
return false;
//如果任务之前已经被排队,将其从队列中删除
if (taskWasPreviouslyQueued)
TryDequeue(task);
return base.TryExecuteTask(task);
}
///
/// 消费队列中等待的任务
///
private void ConsumeTaskOfPending()
{
ThreadPool.UnsafeQueueUserWorkItem(p =>
{
_currentThreadIsProcessingItems = true;
try
{
while (true)
{
Task item;
_lock.Wait();
try
{
if (this._tasks.Count == 0)
{
--this._runingTasks;
break;
}
item = this._tasks.First.Value;
this._tasks.RemoveFirst();
}
finally
{
_lock.Release();
}
base.TryExecuteTask(item);
}
}
finally
{
_currentThreadIsProcessingItems = false;
}
}, null);
}
///
/// 尝试将任务从队列移除
///
/// 要移除的任务
///
protected override bool TryDequeue(Task task)
{
_lock.Wait();
try
{
return this._tasks.Remove(task);
}
finally
{
_lock.Release();
}
}
///
/// 获取当前调度器中已调度任务序列
///
///
protected override IEnumerable
{
_lock.Wait();
try
{
return this._tasks.ToArray();
}
finally
{
_lock.Release();
}
}
}

浙公网安备 33010602011771号