2011-06-16 65 views
2

我有一個對象具有BackgroundWorker線程(純粹是一個Action委託隊列)。即它是普通的,簡單的單生產者單消費者場景。如何在收集擁有對象時終止工作線程?

當收集單個生產者時,我希望它將Terminate操作排入BackgroundWorker線程。

它幾乎聽起來很簡單 - 使用終結器 - 但打破了「不要觸摸終結器中的託管資源」規則。

那麼我該如何確保一旦沒有更多工作要做,線程就乾淨地終止?

回答我寧願不拍:

  • IDisposable:這需要一個龐大的重大更改基類,但我接受它也許需要(這似乎總是與IDisposable的問題模式..)
  • ThreadPool:這些是長時間運行的操作,必須按的順序運行。所以我會考慮專門的線程是合乎邏輯的選擇。
  • WeakReference:我只是想到了這個。也許這是做到這一點的正確方法(?)。基本上,線程保持一個WeakReference回到擁有的對象,並定期喚醒自己,以檢查它是否仍然活着,當它死亡時它排入Terminate。不完全優雅 - 我不喜歡「定期喚醒自己」 - 但這是最​​好的解決方案嗎?

回答

2

IDisposable或類似的聲音對我來說是最好的方法 - 明確地說你什麼時候完成了製作,而不是從垃圾收集中觸發。

基本上,這聽起來像問題不是終止工作線程 - 它表明你已經完成了生產。我明白,在某些情況下這可能會很棘手,但如果在全部可能,它會讓你的生活更具可預測性,如果你能明確地做到這一點。

+0

感謝喬恩,我想這是最好的方法。只是討厭實現'IDisposable'的重大改變是什麼(特別是對象的所有者需要開始實現它)。但是我認爲這確實是確定性地關閉後臺線程的唯一方法。嘆息..我有很多工作在我面前。 – Mania 2011-06-16 06:28:06

+0

@Mania:你有我的同情心。可能值得考慮重新組織其他任何事情是否會讓這個問題變得更簡單。當您需要關閉製作人時,您是否還有其他類型的事件被解僱? – 2011-06-16 06:29:34

+0

不是。生產者的各種方法會添加到後臺線程的隊列中(稍後更新值),所以一旦主生產者丟棄了後臺線程,它就不再具有存在的目的。所以邏輯上 - 這個生產者應該實現IDisposable。問題是基類和其他實現對後臺線程沒有同樣的需求,所以我從來沒有想過要實現IDisposable。但我同意,這是一個值得去做的改變。問候。 – Mania 2011-06-16 07:12:24

相關問題