我在玩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)));
第二个问题是使用同步
Thread.Sleep
调用。用Thread.Sleep(200)
替换await Task.Delay(200)
。可以使用Thread.Sleep
模拟某些工作,但是当您只想等待时,切勿将其与TPL(async-await)一起使用。
关于c# - 异步任务未在后台运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33975227/