我需要在没有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
中没有等待运算符的字符串?
答案 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)
您有两种选择之一:
使用任务的Result
属性。这有一个缺点,它可以阻止消息泵并导致problems。在控制台应用程序中,这可能有效,但您需要进行测试。
GetString2().Result
;
使用ContinueWith
方法传递要在任务完成时执行的操作。缺点是您无法立即访问数据,并且调用函数将返回。
GetString2().ContinueWith(result => Console.WriteLine(result));