0

すべてのタスクが完了したら、完了した行を実行する必要があります。Task.WaitAll(tasks) が処理すると思っていましたが、コールバック メソッドを実行した後、完了した行が実行されます。Task 配列が完了するまでメイン スレッドをブロックする方法はありますか.

Taskpprocessor.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

次のように、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 に答える
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 を返すことであり、それはあなたが待ちたいものだと思います。元のタスクを待っていますが、継続は待っていません。

于 2013-05-09T18:13:42.543 に答える