首页 文章

如何使并行异步并等待使用100%的CPU?

提问于
浏览
0

我搜索了很多代码,说可以使用并行异步的多个内核,但没有一个工作 . 它总是停留在一个核心 .

可能吗?

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 回答

  • -1

    您的代码只创建一个任务,Task.FromResult返回一个已完成的任务,并在while循环后添加,该任务将执行100000次,但由于同步函数Select完成生成,所以一个接一个地执行 .

    您可以将代码更改为:

    class Program
    {
        static void Main(string[] args)
        {
    
            var tasks = Enumerable.Range(0, 1000000).Select(i =>
            {
                return Task.Run(() =>
                {
                    while (true) { }
    
                    return 0;
                });
            });
    
    
            Task.WhenAll(tasks).GetAwaiter().GetResult();
    
        }
    }
    

    它将使用100%,经过测试 .

  • 0

    WhenAll 去获取第一个任务时,它会询问您的查询 task ,以获取第一个任务 . 它将使用选择器尝试将 Range0 )的第一个结果转换为 Task . 由于您的选择器具有无限循环,因此永远不会返回 . 唯一可行的工作就是等待生成第一个任务,直到它永远不会发生 .

    除此之外,您的主线程除了要求线程池线程执行所有操作外,您永远不会创建任何其他线程,因此没有机会在CPU上使用多个内核 .

相关问题