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

时间:2016-04-13 09:57:16

标签: 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);
    }

输出:

  

我:5

     

k:5

所以,我的问题是:await testtest.Result之间的区别是什么?何时使用await test / test.Result

2 个答案:

答案 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可以更好。