我有一個應用程序,動態加載和運行用戶寫的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
這是什麼語言?請添加一個語言標籤。 – Gray 2012-08-01 21:41:58
有趣的問題 - 您的設計模式產生類似於舊的Windows 3.x協同多任務,其中一個行爲異常的應用程序無法產生CPU將掛起其他人(在這裏,他們不會掛起,但他們不會重新啓動直到錯誤的DLL完成) - 那麼不等待所有的DLL完成,只重啓那些已經完成的DLL呢?這是一個選擇嗎? – 2012-08-01 22:01:26
FWIW,用於調度Quartz.net非常有用。 http://quartznet.sourceforge.net/ – 2012-08-01 23:17:27