任务数组中的Task.wait

时间:2013-05-09 17:58:12

标签: c#-4.0

我需要在完成所有任务后执行完成的行。我认为Task.WaitAll(任务)会谨慎但在执行回调方法后我的完成行会被执行。有没有办法阻止主线程直到任务aray完成它。

Taskpprcessor.Batchstart(定义)

public void BatchStart(List<TaskDefinition> definition)
        {
            int i = 0;
            tasks = new Task[definition.Count];
            definition.ForEach((a) =>
            {

                tasks[i] = Task<TaskResult>.Factory.StartNew(() => (TaskResult)a.MethodTocall.DynamicInvoke(a.ARguments));
                tasks[i].ContinueWith(task => RunTaskRetObjResultIns((Task<TaskResult>)task, a.CompleteMethod));    
                i++;

            });
            Task.WaitAll(tasks);
Console.WriteLine("completed");
}

2 个答案:

答案 0 :(得分:0)

你可以使用PLINQ,如:

List<Object> items = new List<Object>();

items.AsParallel().ForAll(obj => { 
    // Write whatever the object is to the string, but do it parallelly
    Console.WriteLine(obj.ToString()); 
});

Conosle.WriteLine("Done");

这将并行执行所有任务,然后在完成时返回。

答案 1 :(得分:0)

我会试试这个:

public void BatchStart(List<TaskDefinition> definition)
{
    Task.WaitAll(
        definition.Select
            (a => Task<TaskResult>.Factory.StartNew(
                () => (TaskResult)a.MethodTocall.DynamicInvoke(a.ARguments)).ContinueWith(task => RunTaskRetObjResultIns((Task<TaskResult>)task, a.CompleteMethod))
            ).ToArray()
        );
    Console.WriteLine("completed");
}

我认为问题是ContinueWith返回一个新的Task,那就是你想要等待的那个。你正在等待原始任务,但不是等待继续。