17

を返すオブジェクトがありますSystem.Threading.Tasks.Task

public class MyClass 
{
    public Task GetTask(object state, CancellationToken cancellationToken)
    {
        return new Task(Execute, state, cancellationToken);
    }

    public void Execute(object context)
    {
        //do stuff
    }
}

他の場所には、があるList<MyClass>ので、次のようにして:を取得しますList<Task>

var myTaskList = myClassList.Select(p => p.GetTask(null, cancellationToken)).ToList();

ができたのでList<Task>、どうすればそれらをすべて並行して開始できますか?これをコーディングするためのより簡潔な方法はありますか?

ありがとう!

4

2 に答える 2

26

「それらを並行して開始する」とはどういう意味ですか? を実行するTaskと、別のスレッドで実行されるため、おそらく単純に次のことを意味します。

foreach(var task in myTaskList)
{
    task.Start();
}

しかし、それらの数が多すぎて開始ロジックを別のスレッドに移動したい場合は、別のスレッド/タスクで上記のコードを呼び出すことができます (私はList<T>.ForEach短いコードに使用しています)。

Task.Factory.StartNew(() => myTaskList.ForEach(task => task.Start()));

または、TPL を使用できますParallel.ForEach。すべてのタスクが開始されるまで、実行中のスレッドは引き続きブロックされますが、内部スレッドプールで開始アクションが実行されるため、多数のアイテムと一部の空き CPU コア/スレッドの場合、開始が大幅に高速化される可能性があります。

Parallel.ForEach(myTaskList, task => task.Start());
于 2012-12-12T10:33:53.663 に答える
6

私はあなたの質問を誤解しているかもしれませんが、すべてのタスクで Start を呼び出すだけではありませんか?

foreach(Task task in myTaskList) 
{
    task.Start();
}

すべてのタスクが完了するのを待っています:

Task.WaitAll(myTaskList.ToArray());
于 2012-12-12T10:28:47.860 に答える