私はAsyncで遊んでいて、以下のサンプルプログラムを作成しました。サンプルプログラムは、同期操作と非同期操作に費やされた時間を比較します
タスクがバックグラウンドスレッドで並行して実行されることを考えると、非同期操作にかかる時間は短くなると予想していました。ただし、以下のプログラムは、同期操作と非同期操作の両方に同じ時間がかかります。私は何かが足りないと思いますが、どこでも非同期タスクを作成して実行するために次の例を取得します
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AsyncTest {
class Program {
private static long max = 100;
static void Main(string[] args) {
var startTime = DateTime.Now;
Console.WriteLine("Start Process at");
//Normal(); //takes about 20 secs
MainAsync().Wait(); //takes about 20 secs
Console.WriteLine($"Total Time Taken {DateTime.Now.Subtract(startTime).TotalMilliseconds} ms");
Console.ReadKey();
}
static void Normal() {
for (long i = 0; i <= max; ++i) {
Thread.Sleep(200);
}
}
static async Task MainAsync() {
var runner = new Runner();
for (int i = 0; i <= 100; ++i) {
await runner.Run(i, max / 100);
}
}
}
public class Runner {
public async Task Run(int idx, long max) {
await Task.Run(() => {
for (long i = 1; i <= max; ++i) {
Console.WriteLine($"Task {idx} - {i}");
Thread.Sleep(200);
}
});
}
}
}
私がここで何が欠けているのか助けはありますか?
最初の問題は、タスクを順番に実行していることです。
for (int i = 0; i <= 100; ++i) {
await runner.Run(i, max / 100);
}
タスクを開始し、完了するまで待ってから、反復を続行します。次のように変更するだけです。
await Task.WhenAll(Enumerable.Range(0, 101).Select(i => runner.Run(i, max / 100)));
2番目の問題は、同期Thread.Sleep
呼び出しの使用です。交換してくださいThread.Sleep(200)
とawait Task.Delay(200)
。Thread.Sleep
一部の作業をシミュレートするために使用することは問題ありませんが、待機したいだけの場合はTPL(async-await)で使用しないでください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加