2010-08-29 24 views
3

我有一個窗體和幾個外部類(串行端口,文件訪問),由窗體實例化。一個類的實例的新線程(C#)

1)在自己的線程中運行外部類的實例最簡單的方法是什麼?

2)表單關閉時,實例的線程是否自動終止?

+2

類實例(對象)不在線程上運行。他們的方法可以,而且可以在多個線程上(一次)。 – 2010-08-29 23:27:02

+0

這是否會自動發生,還是必須將方法設置爲在多個線程上運行?形式Main()具有STAThread方法屬性,可以在單個線程中執行表單中的所有方法嗎?因爲在窗體中使用Thread.Sleep會凍結它。 – OIO 2010-08-29 23:51:31

+1

關於STAThread:「COM線程模型只適用於使用COM互操作的應用程序,在不使用COM互操作的應用程序中使用此屬性不起作用。」 http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx – 2010-08-30 00:14:30

回答

2

1)在自己的線程中運行外部類的實例最簡單的方法是什麼?

類的實例不「運行」。方法呢。

因此,您可能需要查看APM patternBackgroundWorker類。

2)當窗體關閉時,實例的線程是否自動終止?

這取決於線程是如何啓動的。線程可以是background thread或前臺線程 - 後者可以阻止應用程序終止。

+0

我正在檢查基於事件的異步模式和BackgroundWorker類。 – OIO 2010-08-30 00:06:20

1

如果只是想要異步調用的幾行代碼,最好的方法可能是ThreadPool.QueueUserWorkItem。請參閱:What's the difference between QueueUserWorkItem() and BeginInvoke(), for performing an asynchronous activity with no return types needed

+0

我不認爲這就是我想要的,並且類可以像他們需要的那樣大。我正在尋找一種簡單的方法來從父窗體啓動異步實例,並在窗體關閉時終止它們。 – OIO 2010-08-29 23:35:33

0

查看您是否正在使用託管環境,當對象被實例化時,如果超出範圍,它將自動處置。處置實際上由垃圾收集處理。

如果您使用的是UnManaged對象,那麼您有責任在使對象超出範圍之前關閉資源。

垃圾收集定期打開並開始收集超出範圍的所有對象。如果您需要處理大型對象,則可以嘗試使用WeakReference類,該類將保存該對象,並將其暴露給垃圾收集。

閱讀有關的WeakReference和垃圾收集在這裏: http://www.abhisheksur.com/2010/07/garbage-collection-algorithm-with-use.html

我希望這會幫助你。

+0

不確定這是否適用於第二個問題,自動終止從表單開始的線程。 – OIO 2010-08-29 23:41:34

+0

無論您在哪個線程中,垃圾收集都可以在所有線程中工作,或與線程無關。 當表單關閉時,您可以明確地將實例變量設置爲null,以使它們可用於垃圾收集。 – abhishek 2010-08-30 08:18:38