私はコレクション上でいくつかの作業を行う非同期コンソールアプリケーションを作成しようとしています。私は非同期/待機を使用する別のバージョンの並列forループを使用する1つのバージョンを持っています。私は非同期/待機バージョンが並列バージョンと同様に動作することを期待しましたが、同期的に実行します。私は間違って何をしていますか?awaitをループで使用する方法
class Program
{
static void Main(string[] args)
{
var worker = new Worker();
worker.ParallelInit();
var t = worker.Init();
t.Wait();
Console.ReadKey();
}
}
public class Worker
{
public async Task<bool> Init()
{
var series = Enumerable.Range(1, 5).ToList();
foreach (var i in series)
{
Console.WriteLine("Starting Process {0}", i);
var result = await DoWorkAsync(i);
if (result)
{
Console.WriteLine("Ending Process {0}", i);
}
}
return true;
}
public async Task<bool> DoWorkAsync(int i)
{
Console.WriteLine("working..{0}", i);
await Task.Delay(1000);
return true;
}
public bool ParallelInit()
{
var series = Enumerable.Range(1, 5).ToList();
Parallel.ForEach(series, i =>
{
Console.WriteLine("Starting Process {0}", i);
DoWorkAsync(i);
Console.WriteLine("Ending Process {0}", i);
});
return true;
}
}
私は他人についてはわかりませんが、並列for/foreachは並列ループの方がより単純です。 – Brettski
'Ending Process'通知**が表示されているときは、**タスクが実際に終了していないことに注意してください。タスクの*最後の*が終了した直後に、これらの通知はすべて順次破棄されます。 「プロセス1の終了」が表示されるまでには、プロセス1が長時間終了している可能性があります。そこにある言葉の選択以外に+1。 –
@Brettski私は間違っているかもしれませんが、並列ループはあらゆる非同期の結果をトラップします。タスクを返すことで、即座にタスクオブジェクトが返されます。このオブジェクトでは、中止されたり、例外が表示されたりするなど、内部で行われている作業を管理できます。 Async/Awaitを使用すると、Taskオブジェクトをより使いやすくすることができます。つまり、Task.Resultを実行する必要はありません。 –