在一个简单的计算方法上与Task.Run完全异步

时间:2017-02-16 07:42:30

标签: c# asynchronous

我已经开始深入研究异步编程,我想执行一个非常简单的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;
        }
    }

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

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

1 个答案:

答案 0 :(得分:4)

您对Task.Run的了解绝对正确,而且使用Task.Run非常重要

使用Task.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());
}

如果您有兴趣详细了解Task.Run

,还应该阅读Task.Run Etiquette and Proper UsageTask.Run Etiquette Examples: Don't Use Task.Run in the Implementation