2011-03-21 68 views
0

讓我們假設我在一個表單中創建一個後臺工作器作爲一個組件。然後啓動它。 現在,如果我關閉表單,那麼BackgroundWorker將仍然在運行。 您會解釋一下,表單已關閉,表單對象內創建的所有資源都已關閉,但BackgroundWorker仍在運行。這是什麼原因?這是因爲它是在不同的線程上運行。 當它的資源將被CLR重新獲得。c中的BackgroundWorker和資源管理器#

+0

這是你在你的機器上觀察到的,還是你問如果後臺工作人員將運行? – gideon 2011-03-21 11:16:31

+0

取決於誰在聽背景工作者的事件? – 2011-03-21 11:16:35

+0

我正在觀察我的機器,在關閉表單後,backgroundworker仍在運行。 – 2011-03-21 11:18:22

回答

1

的背景工人爲默認情況下不連接到形式或線程它在創建。

甲背景工人是像任何其他對象的對象。當沒有更多的活動引用時它會被收集。

所以它真的取決於對象創建的方式和位置,以及大多數 - 誰仍然有對它的引用。

人們往往忘記的是事件也是參考。因此,如果有另一個對象正在監聽工作人員的事件,工作人員仍將被引用,因此不會被收集。

注:

Form.Close()從視線中刪除的對話框,並調用關閉()和()關閉方法。您仍然可以訪問該表單並稍後恢復。

Form.Dispose()銷燬對話框並將其資源釋放回操作系統。它不調用窗體的Closing()和Closed()方法。一旦處置,你可能不記得一個表格。 Dispose()也將調用所有Form的組件的Dispose()方法。

+0

它實際上是連接到窗體,如果他從工具箱中將它放到窗體上。它位於其組件集合中,它被放置在Form.Dispose上。 – 2011-03-21 11:26:50

+0

然後它與誰連接。當我在窗體設計器類中看到它(工作者)引用。 – 2011-03-21 11:30:25

+0

再次,取決於實施。如果它在表單的組件中,則對錶單的Dispose()調用將調用其中所有組件的dispose()。但一個窗體Close()不會處理()... Dispose()和Close()之間有很大的區別 – 2011-03-21 11:35:53

1

除非您故意壓制處置,否則後臺工作人員將與表單一起處理。如果是這種情況,那麼它應該在不確定的時間收集垃圾。我說應該是因爲事情可能會引用後臺工作者。至於線程,我相信它會在dispose中清理,應該在關閉時從窗體中調用它。

如果表單是主表單,並且關閉導致主要前景線程關閉,則所有後臺線程都將關閉/死亡。

+0

+1 jeez正是我輸入的內容! =) – gideon 2011-03-21 11:17:53

0

當您關閉表單並處理它時,BackgroundWorker也會處理,但它不會停止線程運行。所以只有在DoWork完成後才能完全銷燬。

您可以通過取消關閉表單並在後臺工作人員上調用CancelAsync來表明您希望完成表單來解決此問題。等到它完成後,只有在這之後,您才能真正關閉表單。