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

标签 c# multithreading asynchronous

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

相关文章:

C# 为什么 TextChanged 事件会占用之前的宽度?

java - “java.lang.UnsupportedOperationException: Not supported yet.”

multithreading - Delphi 2009 等待链遍历在 Windows 7 安装中可用吗?

c - 了解多线程共享资源 : shmid, shmat、shmdt

spring-boot - Spring 启动 : Async method not running in separate Thread

spring - AsyncRestTemplate 的 MockRestServiceServer

c# - 6字符短哈希算法

c# - 用于检查数字负性的右移运算符

c# - 如果操作首先完成,则使用 RegisterWaitForSingleObject

c# - 引用方法和异常类(c#、.net)