我搜索过很多代码,说可以使用并行异步的多个内核,但没有一个工作。它总是停留在一个核心。
有可能吗?
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();
}
}
感谢您的帮助。
答案 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();
你可以看到你只会打破一次