2009-04-16 36 views
1

今天的最後一個問題:)感謝您對以前的迴應。 BTW:已經在這個論壇搜索,沒有什麼比這個還好。有沒有什麼方法可以阻止應用程序在系統中仍然工作?Threadpool

我們使用一些第三方庫彈出工作到線程池,我們不想在有未完成的活動時關閉。

關閉應用程序時,即使System.Threading.ThreadPool中存在未完成的工作,應用程序也會關閉,因爲這些線程是回地線程。

除了做某種形式的引用計數(並強制每個項目排入池以使用這種機制,我們沒有控制權),有一些方法可以在出現突出的工作時停止應用程序關閉要做。我已經看過使用GetAvailableThreads()和GetMaxThreads(),但這些可以是相同的,因爲我們可能已經捕獲了線程池,因爲線程被釋放,但沒有分配到排隊的工作項。

所有幫助表示讚賞?

親切的問候 諾埃爾

+0

不知道你使用的是哪種第三方庫,但也許該庫公開了一個函數來檢查它是否仍在處理它的任務?或者,以乾淨的方式關閉它的功能? – 2009-04-16 12:56:05

+0

感謝Bartoz,但不幸的是沒有。 – Bigtoe 2009-04-16 14:47:39

回答

0

感謝您的回覆。我使用AOP和Castle Windsors動態代理在線程池之外找到了一個解決方法,以便在類中注入引用計數。幸運的是,這個類暴露了一個乾淨的界面,我可以把它包裝起來,它可以作爲一種享受。

1

除非你能得到某種回調到第三方代碼(可能是完成事件),你將很難知道什麼時候他們已經使用ThreadPool停止。抱歉。這樣的代碼通常應該在非後臺線程上。我意識到你無法控制這一點 - 我只是不確定是否有一個簡單的方法走出了漏洞。

+0

謝謝馬克。雖然它可能是一個尷尬的。 – Bigtoe 2009-04-16 11:58:15

0

我覺得Marc Gravell是對的。雖然如果你可以以某種方式訪問​​正在線程池中使用的線程,那麼你可以改變Thread.IsBackground屬性爲false來實現你想要的。但我不確定如何獲得對線程池中的託管線程的引用。

1

因爲我是真正的程序員(這是C,男孩;-)我沒有使用ThreadPool。

但是,一個建議浮現在腦海 - 在你發佈到線程池的每個任務上都有一個信號燈增量,並且信號量在完成時釋放。

當您的應用程序退出時,請等待信號量。

有什麼用?

相關問題