0

我需要在所有任务完成后执行完成的行。我认为 Task.WaitAll(tasks) 会小心,但在执行回调方法后,我完成的行被执行。有没有办法阻塞主线程,直到 Task 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");
}
4

2 回答 2

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 返回一个新任务,这就是您要等待的任务。您正在等待原始任务,而不是继续。

于 2013-05-09T18:13:42.543 回答
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");

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

于 2013-05-09T18:04:07.850 回答