Task.Run() 代码是不是异步执行?

Posted

技术标签:

【中文标题】Task.Run() 代码是不是异步执行?【英文标题】:Does Task.Run() code execute asynchronously?Task.Run() 代码是否异步执行? 【发布时间】:2019-02-26 12:44:36 【问题描述】:

我已经定义了这个块代码。谁能告诉我这段代码是异步还是并行? 这个块代码只是一个例子。它创建了四个线程,最后等待所有线程完成。

public Form1()
    
        InitializeComponent();

        var t1 = Task.Run(() =>
        
            GetSum();
        );

        var t2 = Task.Run(() =>
        
            GetSum();
        );

        var t3 = Task.Run(() =>
        
            GetSum();
        );

        var t4 = Task.Run(() =>
        
            GetSum();
        );

        Task.WaitAll(t1, t2, t3, t4);
    

    private int GetSum()
    
        int sum = 0;

        for (int i = 0; i < int.MaxValue; i++)
        
            sum += i;
        

        return sum;
    

【问题讨论】:

请添加您使用的语言的标签,它会吸引更多的人 所有四个任务并行运行,Task.WhenAll 不会停止运行代码,它只是创建一个任务,如果你想等到所有任务完成,你可以等待它。看看Task.WaitAll 感谢您的反馈。我编辑了 4 Task.Run 可以并行运行 如果系统有多个 cpu 核心可以并行运行 异步并行。 【参考方案1】:

首先,Task 不会直接创建线程。 Task 通过 ThreadPool 机制处理线程。它是异步的。这是因为静态方法 Task.Run() 将在 ThreadPool 中排队执行的工作返回给它的调用者。

【讨论】:

所以你的意思是 4 Task.Run 执行异步而不是并行? 我的意思是当这4个任务运行并行执行时这个块代码不仅仅是Task.Run方法 是的,Task.Run 异步执行。异步方法在执行后几乎立即将控制权返回给它的调用者——你显然不知道这和并行之间的区别。异步方法永远不会阻塞线程(或 UI)。对 Task.WaitAll 的调用甚至不会阻塞线程,而是等待四个单独的任务完成在各自的线程上运行(在 ThreadPool 上) 是的,如果我将 async 和 await 键添加到包含 4 个任务的方法中,它仍然是异步的,并且不会阻塞 UI 线程,因为此代码是窗口形式的。那么在这个代码块中添加异步/等待键有什么不同。据我所知,这个代码块正在执行多任务并行任务?

以上是关于Task.Run() 代码是不是异步执行?的主要内容,如果未能解决你的问题,请参考以下文章

Task.Run()方法总结

C# 理解阻塞 UI 和异步/等待与 Task.Run 的问题?

C#异步执行代码块

使用 Task.WaitAll 方法而不是 await 关键字[重复]

C#5.0异步

Task.Run 中的异步 lambda 与常规 lambda [重复]