我写了一个小例子来获取方法5
中的值TestMethod
,我有两种方法可以做到:
static async Task<int> TestMethod()
{
await Task.Delay(0);
return 5;
}
static async Task Caller()
{
Task<int> test = TestMethod();
int i = await test;
Console.WriteLine("i: " + i);
int k = test.Result;
Console.WriteLine("k: " + k);
}
输出:
我:5
k:5
所以,我的问题是:await test
和test.Result
之间的区别是什么?何时使用await test
/ test.Result
?
答案 0 :(得分:6)
static void Caller()
{
Task<int> test = TestMethod();
int k = test.Result;
Console.WriteLine("k: " + k);
}
在此版本中,async
关键字将过时。这是同步方法。执行线程在test.Result
处阻塞,直到任务完成。
static async Task Caller()
{
Task<int> test = TestMethod();
int i = await test;
Console.WriteLine("i: " + i);
}
这是一种(某种)异步版本(它不是真的异步,它只是在不同线程上运行的同步方法)。与第一个版本的不同之处在于编译器为此构建了一个状态机
因此,当达到await test
时,执行线程的控制流将返回给该方法的调用者
任务完成后,此方法的执行将在Console.WriteLine
处恢复(或者更确切地说,在i
的分配时)。
有关编译器的更多信息,您可以阅读this。
如果您需要从UI执行更长的运行任务,则第二个版本非常有用。由于控件在等待任务时返回给调用者,因此不阻止UI线程,并且您的应用程序保持响应。
答案 1 :(得分:1)
Task.Result
等同于Task.Wait
方法,它会在任务完成之前同步阻塞。
await
以异步方式等待,直到任务完成。
如果await
可以更好。