Async 一路 vs. Task.Run 在一个简单的计算方法上

oha*_*nho 1 c# asynchronous

我已经开始深入研究 aync 编程,我想执行一个非常简单的 add 方法作为异步操作。

我读过的一件事是真正的异步程序不需要线程切换 => 这意味着Task.Run(..)可以避免。

这是我实现 add 方法的方式:

public class TaskSimpleExample
    {
        public static void SimpleCalcExample()
        {
            // Will perform in background
            Task<int> resultTask = Task.Run(() => BeginCalcNumbers(6, 6));
            Console.WriteLine("Doing Work");
            Console.WriteLine("Doing More Work");
            Console.WriteLine("Doing Extra Work");
            resultTask.Wait();
            Console.WriteLine("Work is done!");
        }

        static int BeginCalcNumbers(int number1, int number2)
        {
            int result = Add(number1, number2);
            Console.WriteLine(result);
            return result;
        }

        static int Add(int number1, int number2)
        {
            int result = number1 + number2;
            return result;
        }
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,我知道这与async. 它只是打开另一个线程并在后台运行。

我未能将此代码转换为使用async& await(并消除Task.Run)。是否可以 ?(请注意我需要在使用 的方法的其他地方回调之后继续resultTask.Wait())。

Ker*_*rla 6

你所知道Task.Run的完全正确,这几乎是使用的重点Task.Run

UsingTask.Run将在线程池线程上执行一个方法并返回一个代表该方法完成的任务。

正如 Stepthen Cleary 建议的那样,您应该Task.Run只用于调用受 CPU 限制的方法。

另一件重要的事情是,您应该使用Task.Run来实际调用执行大量 CPU 密集型工作的方法,而不是Task.Run在方法的实现中使用。

这是一个关于如何正确使用 Task.Run 的好例子:

class MyService
{
  public int CalculateMandelbrot()
  {
    // Tons of work to do in here!
    for (int i = 0; i != 10000000; ++i)
      ;
    return 42;
  }
}

...

private async void MyButton_Click(object sender, EventArgs e)
{
  await Task.Run(() => myService.CalculateMandelbrot());
}
Run Code Online (Sandbox Code Playgroud)

另外,应阅读Task.Run礼仪和正确使用,并在执行不使用Task.Run:Task.Run礼仪的例子,如果你有兴趣了解更多关于Task.Run