【发布时间】:2016-03-02 17:01:06
【问题描述】:
我在玩 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);
}
});
}
}
}
任何帮助我在这里缺少什么?
【问题讨论】:
-
为什么你会认为在后台线程上运行的东西比在主线程上运行花费的时间更少?在这两种情况下,您都在等待它完成。
-
? 20 秒的任务是在主线程还是其他线程上运行并不重要 - 仍然需要 20 秒...您在寻找
Parallel.For吗? -
您仍然将一项任务作为一项任务运行。无论您在哪个线程上运行它。如果您将其拆分为单独的较小任务并一起运行,则可以加快速度。
-
如果你想在其他线程中运行,你不应该使用 Wait 方法。在此方法中,您可以使用 async void 或 TPL。
-
@AlexeiLevenkov 我认为 Run 方法将是异步的,这意味着一旦我等待它,它将与其他类似调用的任务并行运行。我认为 await runner.Run(...) 应该创建多个线程,这显然不会发生,因为任务是按顺序运行的。
标签: c# multithreading asynchronous