【发布时间】: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