通用调用StartNew和ContinueWhenAll

时间:2016-06-20 06:40:59

标签: c# parallel-processing task-parallel-library

我不是c#的专家,也不是TPL的新手......

我有很多不同的任务,我想要开始,有些依赖于其他人。此外,我想从xml配置文件中决定是否必须执行某些任务,然后根据不执行的任务执行的任务不得等到执行此任务。

使用所有这些的if语句使我的代码过于复杂,所以我想做这样的事情:

static Task<bool> StartTask( List<Task<bool>> dependencies,
                             Func<bool> action)
{
    List<Task<bool>> filtered = new List<Task<bool>>();
    foreach (Task<bool> t in dependencies)
    {
        if (t != null)
        {
            filtered.Add(t);
        }
    }

    Task<bool> task;
    if (filtered.Count == 0)
    {
        task = (Task<bool>)tf.StartNew(action);
    }
    else
    {
        task = (Task<bool>)tf.ContinueWhenAll(filtered.ToArray(), ts => action);
    }

    return task;
}

所以我的想法是在开始时生成每个任务的依赖项列表,然后如果没有执行任何任务,则过滤空任务列表......如果没有执行任务的祖先,我调用StartNew而不是ContinueWhenAll .....这样我用依赖关系设置列表并以通用方式调用所有任务。

但我不知道这是否可行以及如何在c#中进行。有什么想法??

所有任务都返回bool但有不同的参数。

哈维尔

1 个答案:

答案 0 :(得分:1)

我这样写:

await Task.WhenAll(dependencies.Where(t => t != null));
await Task.Run(() => action());

我将Where(t => t != null)部分作为参数验证,并将传递空任务视为非法。