任务调度和WaitHandles
本文关键字:WaitHandles 任务调度 | 更新日期: 2023-09-27 18:22:10
我试图让多个任务使用并发集合中的对象,但只有在特定资源可用时。
为了发出该资源可用性的信号,我使用了ManualResetEvent,我的任务主体如下所示:
while(!_token.IsCancellationRequested)
{
operationsLock.WaitLock();
_token.ThrowIfCancellationRequested();
// dothings
}
然而,我注意到,从解锁到重新安排任务的那一刻,我可能有几百毫秒的时间可以重新启动任务,但它们没有,可能是因为它们根本没有被安排。
我正在使用TaskFactory开始任务,如何改进这种行为?是否有更好的策略在资源不可用时暂停任务?
在这种情况下使用WaitHandle的成本太高,因为等待任务会消耗内存资源。您应该在单个任务中使用集合中的所有可用对象,若并没有可用项,则任务应该完成。
void ConsumingTaskBody()
{
bool available;
do
{
available = _collection.TryGetNext(out item);
Process(item);
}while(available);
}
若有新项目添加到集合中,则应进行检查,若任务已在运行,若未在运行,则启动新项目。
void OnNewItemAdded()
{
if(_taskRunning)
return;
StartNewConsumingTask();
}
您可以使用ThreadPool
,而无需在创建新任务上花费资源。