2016-08-30 48 views
-2

我已经搜索了很多代码,说可以使用多个内核并行异步,但没有任何工作。它总是被困在一个单一的核心。并行任务运行异步并等待 - 无法使用多个内核

可能吗?

贝娄它是一个代码,它使用建议设置在多个核心中运行任务运行,但没有发生。

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

感谢您的所有帮助。

+0

为什么 - 1?哪里不对? –

回答

3

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

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

+0

更不用说控制台本身存在很多争用。考虑到每个操作的开销,并行创建100万个任务是不太可能利用并行性的。这里唯一有趣的CPU工作是'ToString',它根本没有并行化,并且在生成I/O操作时处于瓶颈。 – Luaan

+0

不过,你们是不对的: –

+0

@FernandoSilva你认为什么是不正确的,你为什么认为它不正确? – Servy

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

你可以看到,你将打破只有一次