2014-02-07 64 views
0

在MVC控制器我推出一个新的任务是这样的:主线程如何等待新线程启动?

Task.Run(() => <myFunction>) 

就这么花的时间超过半小时的任务,所以我不想等待它:程序做了启动它后几件事情并将视图发送回浏览器。

但问题是,有时任务没有执行。我想这也许是因为主线程在第二个可以计划执行之前停止。这可能是真正的原因吗?

我该如何等待新任务开始执行,以便我可以将视图发送给客户端?

+3

在ASP.NET环境中,长时间运行的任务应该在某个外部容器中启动,例如Windows服务。将请求传递给Windows服务(通过Remoting或WCR),然后返回您的视图。 –

+1

这就是我在某些情况下所做的:我调用Windows服务中托管的WCF函数,并按前面所述调用它(无需等待或等待)。有时候函数不会被执行,因为主线程在调度器启动新线程之前就停止了。 – Sean

回答

0

这是一个任务需要超过一个半小时,这里

2失误。那么,至少1。选择。

  • 如果它是一个长期运行的任务,那么MARK IT就是这样。有一个提示(Tasks.LongRunning),您可以在工厂中设置。
  • 使用线程。

请勿误导任务系统。一般而言。

现在...

但问题是,有时不执行任务。我认为它可能是 ,因为主线程在第二个可以安排执行之前停止。这 是真正的原因

编号当运行返回,它返回并安排任务。当它开始运行留给任务调度程序 - 尽管这应该是快速的,除非在前面有一个大的队列等待。想要确定开始,可以编写自己的调度程序或使用线程。

什么是可能是整个asp.net进程停止,因为它不是长期运行任务的容器。如果你想安排一个重要的时间操作,那么使用asp.net之外的容器来运行你的任务 - windows服务,就是为了完成这个。正如Windows任务调度程序一样。哎呀,有了正确的权限,您可以将任务作为一个.exe文件并将其作为一个进程启动。不过,我会选择Windows服务。

ASP.NET可能随时决定回收运行网站的whol appdomain /应用程序池并重新启动它。例如,当一段时间没有处理请求(我认为标准设置为20分钟)。你的任务将会被停止。

我该怎么做才能等到新的任务开始其执行,

  • 放在一个ManualResetEvent的主线程等待。
  • 将它交给任务功能。
  • 任务费用的第一件事是信号,因此主线程继续。

虽然没有带来任何问题,但因为它解决了错误的问题。计划任务开始 - 在有时间的时候。你刚刚创建了一个悬挂的asp.net工作线程,这是一个有限的资源,不能解决你认为存在的问题,因为分析不好。

+0

谢谢你这个长时间的解释。然而,当你说“计划任务开始”时,我不同意:我刚做了另一个测试,我认为我的分析是正确的,因为当我执行Task.run并立即将控制权交还给用户时界面,任务有时运行,有时不运行。如果我在Task.run后执行Task.sleep(5000),则该函数总是被调用。因此,如果调用的线程在被调用的线程被调度之前停止,则第二个线程根本不会启动。 – Sean

+0

绝对不是。将是一个超级重要的bug。当你发现99%的错误出现在你的镜像中时,这样的错误不会被忽视。 – TomTom

+0

好吧,无论如何,等待5秒的解决方案彻底解决了我的问题。 – Sean