并行任务使用async和await运行 - 无法使用多个核心

时间:2016-08-30 14:55:33

标签: c# asynchronous parallel-processing async-await

我搜索过很多代码,说可以使用并行异步的多个内核,但没有一个工作。它总是停留在一个核心。

有可能吗?

Bellow它是一个使用推荐设置运行任务在多个核心中运行的代码,但它没有发生。

class Program
{
    static void Main(string[] args)
    {
        Task.Run(async () =>
        {
            var tasks = Enumerable.Range(0, 1000000)
             .Select(i => Console.Out.WriteLineAsync((100000 * 10000).ToString()));

            await Task.WhenAll(tasks);
        }).GetAwaiter().GetResult();
    }
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

Console.Out正在访问的流在技术上暴露了异步操作,但实际上并不是异步执行任何异步操作。所有异步方法实际上都是同步完成所有工作,因为写入控制台的速度非常快,以至于需要更长时间才能完成其他工作。

当然,即使您使用实际具有异步实现的IO操作(例如网络IO)替换了该操作,您仍然不太可能看到很多CPU使用,因为操作是IO绑定的。 CPU只需启动IO操作即可。如果你真的想看到很多CPU核心做了很多工作,你的工作需要主要是CPU绑定工作。

答案 1 :(得分:0)

@Servy是对的,只需在debbuger中运行此代码

        Task.Run(async () =>
        {
            var tasks = Enumerable.Range(0, 1000000)
             .Select(i => Console.Out.WriteLineAsync((100000 * 10000).ToString()));
            Debugger.Break();
            await Task.WhenAll(tasks);

        }).GetAwaiter().GetResult();

你可以看到你只会打破一次