【问题标题】:Calling a WCF asynchronously from an ASP.NET MVC application从 ASP.NET MVC 应用程序异步调用 WCF
【发布时间】:2016-12-02 18:00:28
【问题描述】:

我有一个非常成熟的 n 层 ASP.NET MVC 应用程序,它目前同步执行所有操作;所有控制器都继承自 Controller 而不是 AsyncController。

我想要做的是采用较低层之一(实际上是每个流都会消耗),然后对 WCF 进行等待调用。为什么要等待?好吧,我认为它会减少整体线程数并使服务器更具可扩展性。

但是,我无法更改此层之外的任何代码。所以通常情况下,将调用方法从返回 T 更改为返回“异步任务”,并为方法名称赋予“异步”后缀,例如

来自

public string GetData()

public Task<string> GetDataAsync()

好的,所以我使用以下(缩减)代码:

public ResponseObject GetSomething(RequestObject request)
{
    return MyMethodAsync(request).Result;
}
private static async Task<ResponseObject> MyMethodAsync(RequestObject request)
{
    using (var client = new Client(new NetTcpBinding(), new EndpointAddress(Url))))
    {
       await client.DoSomething(request).ConfigureAwait(true);
    }
}

当我运行此代码 (F5) 时,它会到达调用“await client.DoSomething(request).ConfigureAwait(true);”的行然后,不幸的是,这是我最后一次看到我的线程。有时它会在我调试 (F11) 时返回,但 99% 的情况下不会。

  • 非 ASYNC 方法运行良好

  • 调试 WCF 服务显示它接收到请求,处理它并返回

  • 使用控制台应用程序,可以完美运行。只有当我在 Web 应用程序的“中间”层之一中尝试此操作时,线程才会消失。

  • 我已尝试使用 .ConfigureAwait(true) 和 .ConfigureAwait(false)。

【问题讨论】:

    标签: asp.net-mvc asynchronous concurrency async-await task-parallel-library


    【解决方案1】:

    简短的回答:不要阻塞异步代码(你的问题是 .Result 阻塞,而它的 Task 是并发的,而不是并行的)

    答案很长(阅读也很好):Don't Block on Async Code

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多