主线程如何等待新线程启动?

时间:2014-02-07 23:31:16

标签: c# asp.net-mvc multithreading task

在MVC控制器中,我发起了一个像这样的新任务:

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

这是一项耗时超过半小时的任务,所以我不想等待它:启动它后,程序会执行一些操作并将视图发送回浏览器。

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

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

1 个答案:

答案 0 :(得分:0)

  

这项任务需要半个多小时,

这里有2个错误。嗯,至少1。选择。

  • 如果这是一项长期运行的任务,请将其标记为此类。您可以在工厂中设置提示(Tasks.LongRunning)。
  • 使用线程。

不要误导任务系统。总的来说。

现在...

  

但问题是有时候任务没有被执行。我想也许就是这样   因为主线程在第二个可以被安排执行之前停止。可以吗   是真正的原因

没有。 WHen Run返回,它返回并安排任务。当它开始运行时会留给任务调度程序 - 尽管除非前面有一个大队列,否则它应该很快。想要一个确定的开始,要么编写自己的调度程序,要么使用线程。

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

ASP.NET可能随时决定回收运行网站的whols appdomain / application pool并重新启动它。例如,当一段时间内没有处理任何请求时(我认为标准设置为20分钟)。然后你的任务就会停止。

  

如何等待新任务开始执行,

  • 放入主线程等待的ManualResetEvent。
  • 将其交给任务函数。
  • 任务的第一件事就是发出信号,以便主线继续。

不带任何东西,因为它正在解决错误的问题。计划任务开始 - 有时间的某个时刻。你刚刚创建了一个挂起的asp.net工作线程,这是一个有限的资源,因为分析不好而无法解决你认为存在的问题。

相关问题