如何在没有等待opeartor的情况下获得返回值

时间:2017-12-05 07:28:06

标签: c# .net asynchronous async-await

我需要在没有await运算符的情况下获取返回值(在下面的示例中,我需要在没有await运算符的"hello world"中获取var y)。因为一个方法被引用到很多地方。但我的要求是对于特定操作异步执行方法。没有其他时间足以同步执行。

如果我在所有引用的位置等待,方法需要更改为异步,并且引用的方法需要更改为async和await。 是否有可能获得返回值?

请在下面找到示例代码段:

class Program
{
    static void Main(string[] args)
    {
        var x = getString();
    }

    public static async Task<string> getString()
    {
        var y = await GetString2();
        return y;
    }

    public static async Task<string> GetString2()
    {
        return "hello world";
    }

}
  

这里有任何可能获得&#34; hello world&#34; var y 中没有等待运算符的字符串?

3 个答案:

答案 0 :(得分:5)

你在寻找类似的东西;

var str = GetString2().Result;

Result阻塞调用线程,直到异步操作完成;它等同于Wait方法。 await已异步等待任务完成。

此外,正如@Sir Rufo和@MistyK所描述的那样,您将获得AggregateException可能的异常,因此最好像这样使用GetAwaiter;

var str = GetString2().GetAwaiter().GetResult();

答案 1 :(得分:4)

我不会使用Result因为如果抛出错误,您将获得AggregateException。最好这样做:

var str = GetString2().GetAwaiter().GetResult()

答案 2 :(得分:2)

您有两种选择之一:

  1. 使用任务的Result属性。这有一个缺点,它可以阻止消息泵并导致problems。在控制台应用程序中,这可能有效,但您需要进行测试。

    GetString2().Result;

  2. 使用ContinueWith方法传递要在任务完成时执行的操作。缺点是您无法立即访问数据,并且调用函数将返回。

    GetString2().ContinueWith(result => Console.WriteLine(result));