我正在尝试让多个任务使用并发集合中的对象,但仅限于特定资源可用时。
由于发出此资源可用性的信号,我使用了ManualResetEvent,我的任务主体如下所示:
while(!_token.IsCancellationRequested)
{
operationsLock.WaitLock();
_token.ThrowIfCancellationRequested();
// dothings
}
但是,我注意到从锁定解锁到重新安排任务的那一刻起,我可能有几百毫秒的时间可以重新启动任务,而不是,可能是因为它们根本就没有安排。
我正在使用TaskFactory启动任务,我该如何改善这种行为?当资源不可用时,是否有更好的策略来暂停任务?
答案 0 :(得分:1)
在这种情况下使用WaitHandle太昂贵了,因为等待任务消耗内存资源。 您应该在单个任务中使用集合中的所有可用对象,如果没有可用项,则应该完成任务。
void ConsumingTaskBody()
{
bool available;
do
{
available = _collection.TryGetNext(out item);
Process(item);
}while(available);
}
如果新项目已添加到集合中,您应该检查,如果任务已经运行,如果没有,则启动新项目。
void OnNewItemAdded()
{
if(_taskRunning)
return;
StartNewConsumingTask();
}
您可以使用ThreadPool
,而无需花费资源来创建新任务。