【问题标题】:ASP.NET MVC5: WCF call locks threadASP.NET MVC5:WCF 调用锁定线程
【发布时间】:2018-11-27 11:54:05
【问题描述】:

任务:启动长时间运行的 WCF 方法,然后返回关于成功启动的 JSON。
我已经尝试过 Task.Run (直接调用和异步调用)和 HostingEnvironment.QueueBackgroundWorkItem 并且在 WCF 端我们检测到方法启动,一切正常,但在 MVC 端,动作运行的时间比需要的长得多(例如几分钟) 就像直接调用服务一样。

所以现在的代码是这样的

public virtual JsonResult RunSomeTask(string data)
{
  Task.Run(() => ourService.LongRunningOne());
//or
  Task.Run(() => ourService.LongRunningOneAsync());
//or
  HostingEnvironment.QueueBackgroundWorkItem((ct) => ourService.LongRunningOne());
//or
  HostingEnvironment.QueueBackgroundWorkItem((ct) => {
    ourService.LongRunningOneAsync();
  });

  return Json(new{message = "started"});
}

它就像等待服务调用结束一样工作。
我做错了什么?

【问题讨论】:

  • 这个blog entry 有很好的例子来说明如何使用HostingEnvironment.QueueBackgroundWorkItem(这将是你的首选)。首先从一个简单的 Thread.Sleep 开始(如示例中所示),一旦你得到这个工作,尝试你自己的操作
  • 我需要在单独的线程中运行我的任务,并且在调用后(无需等待结束)控制器操作必须返回结果并将空闲线程返回到池中。
  • 那你可能有概念问题。要么你做一种“Fire And Forget”,那么你将不会收到任何有用的结果,因为当 Request 结束时,Action 还没有完成,没有人知道它是否会完成或何时完成。或者您需要等待结果,在这种情况下,请求将保持打开并运行,但可能会遇到超时等。您可能希望它引入类似SignalR 的内容。你的目的是什么?
  • 看起来问题的根源是 AutoFac。手动创建的服务客户端工作正常。
  • 所以在这个阶段,这是一个不同的话题,祝你好运。

标签: c# asp.net-mvc wcf


【解决方案1】:

在我们的案例中,由于使用了 AutoFac,其中服务配置为InstancePerLifetimeScope(),所以在出现问题的地方(调用Task.Run() 中的服务方法时,QueueBackgroundWorkItem 等)我们只需手动创建新的服务客户端(例如OurDataServiceClient),然后一切正常。

【讨论】:

    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多