采取此细分。
IEnumerable<Task> tasks = CreateTierCleanupTasks();
if (tasks.Count() > 0) {
Task.Factory.ContinueWhenAll(tasks.ToArray(), OnTierCleanupCompleted,
m_CancellationTokenSource.Token,
TaskContinuationOptions.None,
m_TaskScheduler);
Array.ForEach(tasks.ToArray(), (t) => t.Start());
OnTierCleanupStarted();
}
这是指定的动作。
private void OnTierCleanupCompleted(Task[] tasks) {
if (tasks.All(task => task.IsCompleted) && TierCleanupCompleted != null) {
TierCleanupCompleted(this, new EventArgs());
}
RunTierData();
}
现在,在测试运行中,通常会创建5个任务,并且它们都可以正常运行。我在函数体的末尾放了一个Debug.WriteLine("Task Return");
来验证每个任务是否相应返回。为ContinueWhenAll指定的操作从不被触发。我无法弄清楚为什么。我认为当所有指定的Actions返回(即已完成)时,ContinueWhenAll的行为将触发Action。
什么会阻止ContinueWhenAll触发Action?
编辑,这是创建任务的方法:
private IEnumerable<Task> CreateTierCleanupTasks() {
using (FaultTrackObjectContext context = new FaultTrackObjectContext(this.TierInformation.EntityConnectionString)) {
foreach (TeamCollection collection in context.TeamCollections.ToArray()) {
yield return new Task(DeleteTeamCollection, collection.ID, m_CancellationTokenSource.Token);
}
}
}
答案 0 :(得分:1)
问题是你要多次迭代CreateTierCleanupTasks()
的结果。每次,它都会创建一组新的Task
s。所以你在等待一些任务,但是开始不同的任务。
您的代码应如下所示:
Task[] tasks = CreateTierCleanupTasks().ToArray();
if (tasks.Length > 0) {
Task.Factory.ContinueWhenAll(tasks, OnTierCleanupCompleted,
m_CancellationTokenSource.Token,
TaskContinuationOptions.None,
m_TaskScheduler);
OnTierCleanupStarted();
Array.ForEach(tasks, (t) => t.Start());
}