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