【问题标题】: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 核心可以并行运行
  • 异步并行。

标签: c# asp.net multithreading asynchronous parallel-processing


【解决方案1】:

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

【讨论】:

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