我有一个任务工厂,它启动了许多任务,有时超过 1000 个。我将每个任务添加到列表中,并在任务完成后将其删除。
var scan = Task.Factory.StartNew(() =>
{
return operation.Run();
}, token.Token
);
operations.Add(scan);
当任务完成时:
var finishedTask = scan.ContinueWith(resultTask =>
OperationComplete(resultTask),
TaskContinuationOptions.OnlyOnRanToCompletion
);
public virtual void OperationComplete(Task task)
{
operations.Remove(task);
}
全部完成后:
Task.Factory.ContinueWhenAll(operations.ToArray(),
result =>
{
AllOperationsComplete();
}, TaskContinuationOptions.None);
然后,在我的应用程序中的某些点,我想获得正在运行的任务的计数。(这是我得到错误的地方:“集合已修改;枚举操作可能无法执行。”)
public int Count()
{
int running = operations.Count<Task>((x) => x.Status == TaskStatus.Running);
return running;
}
几个问题:
1)我是否应该担心从列表中删除任务?该列表很容易达到 1000 多个。
2) 使 Count() 安全的最佳方法是什么?如果我没记错的话,创建一个新列表并添加operations
到它仍然会枚举集合。