C# 使用异步和等待运行并行任务-无法使用多核

C# 使用异步和等待运行并行任务-无法使用多核,c#,asynchronous,parallel-processing,async-await,C#,Asynchronous,Parallel Processing,Async Await,我搜索了很多代码,说可以使用并行异步的多核,但没有一个有效。它总是卡在一个内核中 可能吗 下面是一段代码,它使用建议设置在多个内核中运行任务运行,但它没有发生 class Program { static void Main(string[] args) { Task.Run(async () => { var tasks = Enumerable.Range(0, 1000000) .Sel

我搜索了很多代码,说可以使用并行异步的多核,但没有一个有效。它总是卡在一个内核中

可能吗

下面是一段代码,它使用建议设置在多个内核中运行任务运行,但它没有发生

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();
    }
}

感谢所有的帮助。

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


当然,即使将该操作替换为实际具有异步实现(如网络IO)的IO操作,也不太可能看到大量CPU使用,因为该操作受IO限制。CPU只需启动IO操作即可。如果你真的想看到大量的CPU核心在做大量的工作,你的工作需要主要是CPU绑定的工作。

@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();

您可以看到您只会中断一次

为什么-1?怎么了?更不用说控制台本身有很多争议了。考虑到每个单独操作的开销,并行创建一百万个任务根本不可能利用并行性。这里唯一有趣的CPU工作是
ToString
,它根本没有并行化,并且在生成I/O操作时遇到了瓶颈。@FernandoSilva您认为什么是不正确的,为什么您认为它不正确?