任务调度和WaitHandles

时间:2013-07-12 12:44:05

标签: c# .net task waithandle taskfactory

我正在尝试让多个任务使用并发集合中的对象,但仅限于特定资源可用时。

由于发出此资源可用性的信号,我使用了ManualResetEvent,我的任务主体如下所示:

        while(!_token.IsCancellationRequested)
        {
            operationsLock.WaitLock();
            _token.ThrowIfCancellationRequested();
            // dothings
        }

但是,我注意到从锁定解锁到重新安排任务的那一刻起,我可能有几百毫秒的时间可以重新启动任务,而不是,可能是因为它们根本就没有安排。

我正在使用TaskFactory启动任务,我该如何改善这种行为?当资源不可用时,是否有更好的策略来暂停任务?

1 个答案:

答案 0 :(得分:1)

在这种情况下使用WaitHandle太昂贵了,因为等待任务消耗内存资源。 您应该在单个任务中使用集合中的所有可用对象,如果没有可用项,则应该完成任务。

void ConsumingTaskBody()
{
    bool available;
    do
    {
        available = _collection.TryGetNext(out item);
        Process(item);
    }while(available);
}

如果新项目已添加到集合中,您应该检查,如果任务已经运行,如果没有,则启动新项目。

void OnNewItemAdded()
{
    if(_taskRunning) 
       return;
   StartNewConsumingTask();
}

您可以使用ThreadPool,而无需花费资源来创建新任务。