考虑这个相当简单的方法:
private bool ValidateKey(HttpRequestMessage message)
{
}
上面的方法调用如下
if (!ValidateKey(request))
{
//do something
}
现在我想在 ValidateKey 中调用一个返回 Task 的方法。假设它是 HttpRequestMessage 中的 ReadAsStringAsync 方法:
message.Content.ReadAsStringAsync();
既然这个方法可以异步运行,我应该这样调用它:
string output = await message.Content.ReadAsStringAsync();
但是这将需要我更改我的方法签名以包括异步和 Task 的返回类型,然后调用者也...无限。
可以同步调用 ReadAsStringAsync,即我愿意让 ValidateKey 等到 ReadAsStringAsync 完成。这将省去我为了迎合这一种方法而更改代码的麻烦。
最佳答案
没有。如果操作本质上是异步的,则您无法同步运行它。但是,您可以阻塞线程并等待它完成。
不过,我强烈建议不要这样做。你应该让你的操作一直async
,或者根本不使用异步操作。
您还可以使用 AsyncContext斯蒂芬·克利里:
string output = AsyncContext.Run(() => message.Content.ReadAsStringAsync());
如果您仍计划阻塞,则使用 GetAwaiter().GetResult()
,因为它在异常处理方面更接近于 await
将执行的操作:
string output = message.Content.ReadAsStringAsync().GetAwaiter().GetResult();
关于c# - 我可以创建一个返回 Task<T> 的方法来同步运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29117059/