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