【发布时间】:2012-10-06 05:45:53
【问题描述】:
我想获取我正在阻塞队列中添加的当前正在执行的Task,如何完成?
编辑:我正在使用这个优先级调度程序,并添加多个具有不同优先级的任务:
public class PriorityScheduler : TaskScheduler
{
public static PriorityScheduler Highest = new PriorityScheduler(ThreadPriority.Highest);
public static PriorityScheduler AboveNormal = new PriorityScheduler(ThreadPriority.AboveNormal);
public static PriorityScheduler Normal = new PriorityScheduler(ThreadPriority.Normal);
public static PriorityScheduler BelowNormal = new PriorityScheduler(ThreadPriority.BelowNormal);
public static PriorityScheduler Lowest = new PriorityScheduler(ThreadPriority.Lowest);
public static BlockingCollection<Task> _tasks = new BlockingCollection<Task>();
private Thread[] _threads;
private ThreadPriority _priority;
private readonly int _maximumConcurrencyLevel = Math.Max(1, Environment.ProcessorCount);
public PriorityScheduler(ThreadPriority priority)
{
_priority = priority;
}
public override int MaximumConcurrencyLevel
{
get { return _maximumConcurrencyLevel; }
}
protected override IEnumerable<Task> GetScheduledTasks()
{
return _tasks;
}
protected override void QueueTask(Task task)
{
_tasks.Add(task);
if (_threads == null)
{
_threads = new Thread[_maximumConcurrencyLevel];
for (int i = 0; i < _threads.Length; i++)
{
int local = i;
_threads[i] = new Thread(() =>
{
foreach (Task t in _tasks.GetConsumingEnumerable())
base.TryExecuteTask(t);
});
_threads[i].Name = string.Format("PriorityScheduler: ", i);
_threads[i].Priority = _priority;
_threads[i].IsBackground = true;
_threads[i].Start();
}
}
}
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
return false; // we might not want to execute task that should schedule as high or low priority inline
}
}
我想根据优先级停止和恢复任务,例如如果有更高优先级的新任务到达,则低优先级停止并让任务执行,然后自行恢复......
【问题讨论】:
-
您能否提供一个简短的代码示例,其中包含您想要“获取当前正在执行的任务”的 cmets?
-
您希望如何停止正在运行的任务?
-
我的意思是取消一个正在运行的任务......然后用相同的凭据重新启动它......如果有一个优雅的方式,分享它吗?
-
不,我相信实际上没有什么好的方法可以做到这一点。而且我认为取消
Task然后再次重新启动它也行不通。一旦Task完成,无论成功与否,它都完成了。
标签: c# task-parallel-library blockingqueue