doOne
通話を同時に発生させますか?次に、タスクファクトリから直接開始できます。
// Start two concurrent tasks
var task1 = Task.Factory.StartNew(() => doOne(SelectedTask.option1));
var task2 = Task.Factory.StartNew(() => doOne(SelectedTask.option2));
// Block the current thread until all tasks complete
Task.WaitAll(task1, task2);
doOne
通話を順番に発生させますか?次に、以下を使用してそれらをチェーンできますContinueWith
。
// Start a chain of tasks
var task1 = Task.Factory.StartNew(() => doOne(SelectedTask.option1));
var task2 = task1.ContinueWith(t => doOne(SelectedTask.option2));
// Block the current thread until the last task completes
task2.Wait();
投稿のタイトルにあるコード(いくつかの修正を含む)は、基本的に、上記のシーケンシャルタスクチェーンとまったく同じ機能を実行しています。
Task.Factory.StartNew(() => doOne(SelectedTask.option1))
.ContinueWith(t => doOne(SelectedTask.option2))
.Wait();
以下の質問に答えてください。
SelectedTasks
私が正しく理解していれば、変数リストのタスクを並行して実行できるようにしたいと思います。
List<SelectedTask> selectedTaskOptions = new List<SelectedTask>()
{
SelectedTask.option1,
SelectedTask.option2,
SelectedTask.option3,
SelectedTask.option4,
SelectedTask.option5
};
RunAllSelectedTaskOptions(selectedTaskOptions);
RunAllSelectedTaskOptions
のリストを受け入れて実行するにはSelectedTasks
:
public void RunAllSelectedTaskOptions(List<SelectedTask> selectedTaskOptions)
{
List<Task> createdTasks = new List<Task>();
foreach(var taskOption in selectedTaskOptions)
{
createdTasks.Add(Task.Factory.CreateNew(() => doOne(taskOption)));
}
Task.WaitAll(createdTasks);
}
実装の別の方法は、RunAllSelectedTaskOptions
を使用することParallel.ForEach
です。これは並行して実行され、最も遅い/最後の反復が完了するまでブロックされます。
public void RunAllSelectedTaskOptions(List<SelectedTask> selectedTaskOptions)
{
Parallel.ForEach(selectedTaskOptions, taskOption => doOne(taskOption));
}