0

我试图让多个任务消耗来自并发集合的对象,但仅在特定资源可用时。

为了表明此资源的可用性,我使用了 ManualResetEvent,我的任务主体如下所示:

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

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

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

4

1 回答 1

1

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

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

如果新项目添加到集合中,您应该检查任务是否已经运行,如果没有,则开始新的。

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

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

于 2013-07-13T19:01:39.513 回答