2014-02-07 104 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