当前位置: 首页 > 知识库问答 >
问题:

在WebAPI死锁中同步调用异步方法,即使使用ConfigureAwait(false)

龙俊德
2023-03-14
    private QueryResult ExecuteSync()
    {
        var queryResults = ExecuteAsync();
        queryResults.Wait();
        return queryResults.Result;
    }

    private async Task<QueryResult> ExecuteQueryTaskAsync()
    {
        var queryTask = new QueryTask(_uri);
        return await queryTask.ExecuteAsync(_query).ConfigureAwait(false);
    }

在我的程序/服务中非常有效。但是在Web API 2控制器中以这种方式使用executesync会导致控制器完全冻结,并且永远不会返回响应。

我做了一些研究,相信这里提到了罪魁祸首:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

我绝对不想异步使用该函数。上面的函数是如此的核心,并且隐藏在4个包装器中,所以仅仅为了支持一个web api调用而冒泡异步方法将是对我的库类的一次重大改革。

我正在寻找围绕web API的这种奇怪行为的工作方法/黑客/建议,以允许我同步运行这个异步方法,而不让它死锁

共有1个答案

赵超
2023-03-14

我绝对不想异步使用该函数。

不过我不得不说。异步代码是最好的解决方案。您正在执行的操作是异步的,为它公开同步API充其量是有问题的。

需要时间吗?当然可以。但是你的代码会更好。

private QueryResult ExecuteSync()
{
  return Task.Run(() => ExecuteAsync()).GetAwaiter().GetResult();
}
 类似资料:
  • 同步调用异步方法最安全的方法是什么?

  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 我是web服务开发的初学者。我们正在使用Spring3用java构建RESTWeb应用程序。 我们正在使用的Web服务具有异步登录方法。我们为他们提供了一个回调监听器URL,他们的服务在其中发回响应。 因此,当我们发送登录请求时,我们会收到一个空白响应作为确认。和服务发送一个响应,其中包含侦听器URL上的实际数据。 请帮助,我应该如何设计/实现调用登录服务作为同步调用?谢谢 编辑:下面是回发消息的

  • 我正在为一家德国公司评估Dart,将各种Java程序移植到Dart,并对结果进行比较和分析。在浏览器中,飞镖轻松获胜。对于服务器来说,软件性能似乎是一个严重的问题(请看我的这个问题),但这基本上得到了缓解。 现在我正在移植一些“简单”的命令行工具,我没想到会有任何严重的问题,但至少有一个问题。一些工具确实会发出HTTP请求来收集一些数据,独立的Dart虚拟机只以异步方式支持它们。纵观所有我能找到的

  • 我的代码有点像这样:所以我想异步调用SendSms部分。我该怎么做?我可以简单地使用task.run Async和await吗?