我已经开始深入研究 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()
)。
你所知道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
归档时间: |
|
查看次数: |
1476 次 |
最近记录: |