2012-08-01 186 views
2

我有一個應用程序,動態加載和運行用戶寫的DLL。它有一個在計時器上運行的調度引擎,並檢查運行哪些「規則」(dll)。每個規則是用在自己的線程開始:線程殺死超時

private void OnTimer(...) 
{ 
    timer.stop(); 
    ... 
    foreach(RuleData ruleData in RulesToRun) 
     ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ExecuteRule), ruleData); 
    _asyncOpsAreDone.WaitOne(); 
    timer.start(); 
} 

當異步操作完成後,該程序等待schedualing計時器滴答並運行另一個循環。

問題是,有時用戶會寫出花費大量時間運行的dll。

  • 如果我會等待:這將推遲一個時鐘嘀噠(因爲它在執行是採空後再次啓動)
  • 如果我不會等待:我在尋找未知數量的運行規則並行,完成我的應用程序用戶池。

如果您將考慮到一個規則執行可能會掛起,我的選擇介於兩者之間:同步 - 掛起所有規則或異步乾式資源池。

我認真地想過放棄規則的執行超時,但.Abort()是不那麼受歡迎: Timeout Pattern - How bad is Thread.Abort really?

而且並行任務的消技術progrming解決方案,包括編寫「ThrowIfCancellationRequested();」在DLL執行(我沒有源代碼) http://msdn.microsoft.com/en-us/library/dd997396.aspx

+0

這是什麼語言?請添加一個語言標籤。 – Gray 2012-08-01 21:41:58

+0

有趣的問題 - 您的設計模式產生類似於舊的Windows 3.x協同多任務,其中一個行爲異常的應用程序無法產生CPU將掛起其他人(在這裏,他們不會掛起,但他們不會重新啓動直到錯誤的DLL完成) - 那麼不等待所有的DLL完成,只重啓那些已經完成的DLL呢?這是一個選擇嗎? – 2012-08-01 22:01:26

+0

FWIW,用於調度Quartz.net非常有用。 http://quartznet.sourceforge.net/ – 2012-08-01 23:17:27

回答

0

通過「sgorozco」第三個評論幫助過我的,我選擇最繼續asyncronously運行規則,但跳過已經是那些正在處理這種方式I:

  • 準時完成工作,完成其他寫入正確的規則。

  • 跳過卡住的作業。

  • 避免殺死線程並留下破碎的內存垃圾。