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您认为什么是不正确的,为什么您认为它不正确?