我搜索了很多代码,说可以使用并行异步的多个内核,但没有一个工作 . 它总是停留在一个核心 .
可能吗?
This is uses 100% of the cpu:
class Program
{
static void Main(string[] args)
{
Parallel.For(0, 100000, p =>
{
while (true) { }
});
}
}
Using parallel async, I dont get more than 12%:
class Program
{
static void Main(string[] args)
{
Task.Run(async () =>
{
var tasks = Enumerable.Range(0, 1000000).Select(i =>
{
while (true) { }
return Task.FromResult(0);
});
await Task.WhenAll(tasks);
}).GetAwaiter().GetResult();
}
}
100% cpu. Thanks all that helped, and not just mocked or tried to close:
class Program
{
static void Main(string[] args)
{
Task.Run(async () =>
{
var tasks = new List<Task>();
for (int i = 0; i < 100; i++)
tasks.Add(Task.Run(() =>
{
while (true) { }
}));
await Task.WhenAll(tasks);
}).GetAwaiter().GetResult();
}
}
2 回答
您的代码只创建一个任务,Task.FromResult返回一个已完成的任务,并在while循环后添加,该任务将执行100000次,但由于同步函数Select完成生成,所以一个接一个地执行 .
您可以将代码更改为:
它将使用100%,经过测试 .
当
WhenAll
去获取第一个任务时,它会询问您的查询task
,以获取第一个任务 . 它将使用选择器尝试将Range
(0
)的第一个结果转换为Task
. 由于您的选择器具有无限循环,因此永远不会返回 . 唯一可行的工作就是等待生成第一个任务,直到它永远不会发生 .除此之外,您的主线程除了要求线程池线程执行所有操作外,您永远不会创建任何其他线程,因此没有机会在CPU上使用多个内核 .