我可以创建一个返回Task <T>同步运行的方法吗?

bob*_*lex 4 c# async-await

考虑这个相当简单的方法:

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完成.这样可以省去更改代码的麻烦,只是为了迎合这一方法.

i3a*_*non 8

否.如果操作本质上异步的,则无法同步运行.但是,您可以阻止该线程并等待它完成.

我会高度建议不要这样做.您应该完全执行操作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)

  • @BobbyAlexander我知道,这是值得的.否则,您将限制可伸缩性和响应能力并冒着死锁的风险. (3认同)