基本的には、私はたくさんのタスク(10)を持っていて、それらをすべて同時に開始し、完了するのを待っています。完了したら、私は他のタスクを実行したい。私はこれについて、リソースの束を読んで、私はここで 並行してタスクを実行する
が(コードが簡素化されました)私は現在持っているものです...右私の特定のケースのためにそれを得ることができません。public async Task RunTasks(){
var tasks = new List<Task>
{
new Task(async() => await DoWork()),
//and so on with the other 9 similar tasks
}
Parallel.ForEach(tasks, task =>
{
task.Start();
});
Task.WhenAll(tasks).ContinueWith(done=>{
//Run the other tasks
});
}
//This function perform some I/O operations
public async Task DoWork(){
var results = await GetDataFromDatabaseAsync();
foreach(var result in results){
await ReadFromNetwork(result.Url);
}
}
だから、私の問題WhenAll
コールでタスクが完了するのを待っているときに、完了していないのにすべてのタスクが終了していることがわかります。私はforeach
にConsole.WriteLine
を追加しようとしました。私は継続タスクを入力したとき、データは以前のTask
から入ってきて、実際には終了しません。
私はここで間違っていますか?
は、私はあなたが持っているすべての本に疑う 'タスク'どこか(タスクのコンストラクタは直接やや疑わしい呼び出し)とあなたが本当に内部の作業を待つしたいです。 Taskコンストラクタ/ Startの代わりに 'Task.Run'を使用できますか? 'Task.Run'はアンラップを行います。 –
は、だから、私がやるべきだと思う: VARタスク=新しいリスト { Task.Run(()=> DoWork()) } –