我有一个连接到 WCF 服务的 ASP.NET MVC 3 站点。WCF 服务独立于站点并托管在 Windows 服务中。大多数调用都是同步的,因此等待 WCF 执行它不是问题。
但是,其中一个(已经实现的)调用花费的时间太长了,而且由于它本质上不直接输出任何东西,我想在服务上旋转它并忘记它。
所以我改变了我的代码:
public ViewResult StartSlowCalculation(CalculationOptions calculationOptions)
{
WcfServiceProxy.DoSlowCalculation(calculationOptions);
ViewBag.Started = true;
return View();
}
至
public ViewResult StartSlowCalculation(CalculationOptions calculationOptions)
{
Task.Run(() =>
{
WcfServiceProxy.DoSlowCalculation(calculationOptions);
});
ViewBag.Started = true;
return View();
}
据我了解,它应该启动一个异步请求,并立即返回。尽管如此,执行是完全同步的,并且 UI 被冻结直到操作结束。
我错过了什么明显的东西?
更新:
另外,请注意,我不希望将服务器实现更改为异步实现,只是为了取消同步对调用站点上服务的调用。
此外,我注意到该StartSlowCalculation
方法完成执行,但服务器在服务方法完成执行之前不会返回响应。
WCF 服务代理只是做:
public void DoSlowCalculation(CalculationOptions calculationOptions)
{
//some logging code
Channel.DoSlowCalculation(calculationOptions);
}
所以它是完全同步的,但这并不重要,因为它应该在一个独立的线程上执行。