我需要在完成所有任务后执行完成的行。我认为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");
}
答案 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,那就是你想要等待的那个。你正在等待原始任务,但不是等待继续。