什么阻止Task.Factory.ContinueWhenAll调用指定的Action?

时间:2011-08-26 19:58:52

标签: c# task-parallel-library

采取此细分。

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);
        }
    }
}

1 个答案:

答案 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()); 
}