任务调度和WaitHandles

本文关键字:WaitHandles 任务调度 | 更新日期: 2023-09-27 18:22:10

我试图让多个任务使用并发集合中的对象,但只有在特定资源可用时。

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

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

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

我正在使用TaskFactory开始任务,如何改进这种行为?是否有更好的策略在资源不可用时暂停任务?

任务调度和WaitHandles

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

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

若有新项目添加到集合中,则应进行检查,若任务已在运行,若未在运行,则启动新项目。

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

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