考虑这个相当简单的方法:
private bool ValidateKey(HttpRequestMessage message)
{
}
Run Code Online (Sandbox Code Playgroud)
上述方法如下所述
if (!ValidateKey(request))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
现在我想在ValidateKey中调用一个返回Task的方法.我们假设它是HttpRequestMessage中的ReadAsStringAsync方法:
message.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)
既然这个方法可以异步运行,我理想情况下应该像这样调用它:
string output = await message.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)
但是这需要我改变我的方法签名以包括async和返回类型到Task,然后调用者也包括... ad infinitum.
可以同步调用ReadAsStringAsync,即我愿意让ValidateKey等到ReadAsStringAsync完成.这样可以省去更改代码的麻烦,只是为了迎合这一方法.
否.如果操作本质上是异步的,则无法同步运行.但是,您可以阻止该线程并等待它完成.
我会高度建议不要这样做.您应该完全执行操作async,或者根本不使用异步操作.
你也可以使用Stephen Cleary的AsyncContext:
string output = AsyncContext.Run(() => message.Content.ReadAsStringAsync());
Run Code Online (Sandbox Code Playgroud)
如果您仍然计划阻止,那么请GetAwaiter().GetResult()在异常处理中使用,因为它await会做什么:
string output = message.Content.ReadAsStringAsync().GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5645 次 |
| 最近记录: |