任务<TResult> .Result vs等待任务

Tân*_*Tân 2 c# task

我写了一个小例子来获取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

Ren*_*ogt 6

第一版

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线程,并且您的应用程序保持响应.