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

标签 c# async-await

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

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/

相关文章:

c# - 有没有一种方法可以像在 eclipse 中那样在 visual studio 2012 中生成 getter、setter 函数

c# - 选项过滤器的下拉列表层次结构

c# - 如何避免与 IoC 容器耦合

javascript - 使用 Typescript 异步进行 Mocha API 测试

c# - WPF MVVM 异步事件调用

C# 如何在命令行应用程序中使用异步方法运行线程

javascript - 如何使用多个异步/等待功能?

c# - 在使用 TFS SDK checkin 文件之前如何预测/获取下一个 ChangeSetId

javascript - while 循环不会随机生成数据

c# - 非典型系统中的命名空间和类命名最佳实践