2013-04-29 57 views
-1

非常少見我和線程,後臺工作人員等一起工作,但從來沒有試圖知道我們應該使用哪一個以及每種技術如何在內部工作。所以在這裏我提出了關於線程,異步調用方法,後臺工作者或TPL的幾個問題。我在這裏道歉,我問了幾個問題。我的要求是請閱讀並詳細回答。關於調用方法的各種方式

  1. 當我們運行我們的應用程序時,應用程序以一個稱爲主線程的線程開始。 GUI相關的控件是在另一個線程上創建的,我聽到了多少....是真的嗎?有沒有爲GUI創建任何線程?

  2. 當我們調用很少的方法,然後所有的方法調用順序發生意味着一個方法調用立場&結束然後下一個方法將星號和一切發生在主線程。這就是主線程被阻塞的原因。如果我們不想阻塞主線程,那麼我們總是喜歡在另一個線程上異步運行方法。異步調用任何方法意味着在單獨的線程上執行方法是真的嗎?如果不是這意味着異步調用在同一線程中執行而不阻塞主線程的任何方法?如果是,那麼它是如何可能的。請詳細解釋。

  3. 當我們調用任何不會阻塞主線程的異步方法時,實際發生了什麼?我需要知道幕後發生了什麼。

  4. 通過thread.start調用方法和異步調用方法有什麼區別?

  5. 後臺工作者異步執行方法在同一主線程或單獨的線程?

  6. 當我們調用帶thread.start的方法時,如何指定回調,當我的方法完成後會發生回調並讓我知道該方法完成。我嘗試用thread.start找到這樣的例子,但沒有找到。所以請幫我用示例代碼來做。

  7. 任務並行庫的主要目標是什麼。 TPL在主線程或獨立線程中執行任何方法?

我們可以使用thread.start或後臺工作或調用任何方法以異步方式來解決我們的目的又是什麼多餘的東西是給TPL爲人們使用它?

+2

建議閱讀:[C#中的線程](http://www.albahari.com/threading/) – 2013-04-29 20:01:22

+0

我正要回答,但我發現自己在重複自己。對BackgroundWork課程進行一些研究,然後回過頭來,將您的問題修改爲一個問題。如果你研究異步和同步線程之間的區別,每個問題都可以由你自己來回答。由於您有7個不同的問題,而且大多數問題都非常廣泛,所以我對此標記並不具有建設性。 – 2013-04-29 20:05:27

+1

你應該問每個問題一個問題,而不是一個問題。正如拉姆霍德所說,這些問題中的一部分或者是相同的,或者可以合併成一個問題,但其中有些問題是不同的,應該在他們自己的問題中。 – Servy 2013-04-29 20:18:30

回答

1

您的GUI線程與您的應用程序啓動的威脅線程相同。默認情況下,你的應用程序只是一個單獨的線程(好吧...在後臺是多線程,但是那些處理一些.NET垃圾收集的東西,你不需要擔心)。

除主線程外還有多種線程機制。所有使用本質上相同的東西:Thread類。所以是的,所有其他線程操作都不在主線程上運行。

每個線程mechanisme已經贊成的和反對的:

Thread類
Thread類是所有這些的基礎。您可以啓動它,加入(等到它完成)並終止它(Abort已棄用,不建議使用它)。創建一個新的線程花費相當多的時間(在我的機器上+/- 5毫秒)。它不提供任何其他同步機制作爲回調。你必須自己寫。

線程池
由於線程的創建速度非常慢,.NET有一個線程池。線程池準備好進行異步操作。當一個異步操作排隊時,線程池將其選中並將其分配給已創建的空閒線程。該線程將執行該操作。您可以使用ThreadPool.QueueUserWorkItem排隊操作。回調是可能的。 TreadPool只能用於快速操作。 I/O操作可能佔用大量時間,這可能會阻止其他排隊操作。

異步調用
.NET有很多不同的異步調用,如與代表InvokeAsync。大多數這些操作都被推入到ThreadPool的隊列中,因爲所有這些方法都支持它。非常方便。大多數I/O操作(如StreamReader.BeginRead)都在新創建的線程上執行。

BackgroundWorker的
BackgroundWorker的也使用線程池來處理其業務的人。

並行
並行類附帶.NET框架4.0。已經創建了使(大型)集合上的操作更容易。所有需要在集合中的所有項目上完成的操作被分成幾個線程(在TreadPool上),從而允許在多核處理器的所有內核之間劃分工作負載。

+0

*「所有這些操作都被推入ThreadPool的隊列中」 - 實際上並非所有I/O方法都是如此。如果可能,I/O異步調用將使用I/O完成端口工具,這意味着它們根本不會佔用線程。 – cdhowie 2013-04-29 20:20:28

+0

另外,值得注意的是'Thread.Abort()'已被棄用,不應該被使用。當線程中止時,調用堆棧中的finally塊將不會運行。這具有非常嚴重的後果,例如擁有監視器的線程中止(例如,在「鎖定」塊中)將不會釋放監視器,從而使對象永久鎖定。 – cdhowie 2013-04-29 20:22:58

+0

@cdhowie:你對I/O操作是正確的。我更新了我的答案。非常感謝你的幫助。 – 2013-04-29 20:28:48