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

C# 主线程如何等待新线程启动?,c#,asp.net-mvc,multithreading,task,C#,Asp.net Mvc,Multithreading,Task,在MVC控制器中,我启动了如下新任务: Task.Run(() => <myFunction>) 这是一项需要半个多小时才能完成的任务,所以我不想等待:启动程序后,程序会执行一些操作,并将视图发送回浏览器 但问题是有时任务没有执行。我认为这可能是因为主线程在第二个线程被安排执行之前就停止了。这是真正的原因吗 如何等待新任务开始执行,以便将视图发送给客户端 这项任务需要半个多小时 这里有两个错误。嗯,至少有一个。选择 如果是长时间运行的任务,请将其标记为长时间运行。有一个提示T

在MVC控制器中,我启动了如下新任务:

Task.Run(() => <myFunction>)
这是一项需要半个多小时才能完成的任务,所以我不想等待:启动程序后,程序会执行一些操作,并将视图发送回浏览器

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

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

这项任务需要半个多小时

这里有两个错误。嗯,至少有一个。选择

如果是长时间运行的任务,请将其标记为长时间运行。有一个提示Tasks.LongRunning,您可以在工厂中设置。 用一根线。 不要误导任务系统。一般来说

现在

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

否。当Run返回时,它将返回并计划任务。当它开始运行时,由任务调度器决定——尽管这应该很快,除非前面有一个大队列在等待。想要一个确定的开始,要么编写自己的调度程序,要么使用线程

整个asp.net进程可能会停止,因为它不是长时间运行任务的容器。如果您想安排一个重要的时间操作,那么使用asp.net之外的容器来运行您的任务—windows服务正是为此而设计的。windows任务调度程序也是如此。见鬼,只要有正确的权限,你就可以将任务设置为.exe并将其作为进程启动。不过,我会选择windows服务

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

我怎样才能等到新任务开始执行

放入主线程等待的ManualReset事件。 将其交给任务函数。 任务要做的第一件事是向它发送信号,以便主线程继续。
但是没有带来任何东西,因为它解决了错误的问题。计划任务确实会在有时间的某一点启动。您刚刚创建了一个挂起的asp.net工作线程,它是一个有限的资源,无法修复您认为由于分析错误而存在的问题。

在asp.net环境中,长时间运行的任务应该在一些外部容器中启动,如Windows服务。通过远程处理或WCR将请求传递给您的Windows服务,然后返回您的视图。在某些情况下,我会这样做:我调用Windows服务中托管的WCF函数,并按照前面提到的方式调用它,而不必等待或等待。有时该函数不会执行,因为主线程在调度程序启动新线程之前停止。感谢您的详细解释。但是,我不同意你所说的计划任务确实开始了:我刚刚做了另一个测试,我认为我的分析是正确的,因为当我执行task.run并立即将控件返回到用户界面时,任务有时运行,有时不运行。如果我只是在Task.run之后执行Task.sleep5000,则始终调用该函数。因此,如果调用线程在被调用线程被调度之前停止,那么第二个线程根本不会启动,绝对不会。这将是一个超级关键的错误。当你发现99%的时间错误都在你的镜子里,这样的错误不会被忽视。好吧,无论如何,等待5秒的解决方案完全解决了我的问题。