gpt4 book ai didi

c# - 异步任务未在后台运行?

转载 作者:行者123 更新时间:2023-12-03 13:13:53 24 4
gpt4 key购买 nike

我在玩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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com