我已经开始深入研究异步编程,我想执行一个非常简单的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()
)的方法中的其他地方回调后继续。
答案 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