2011-04-07 129 views
8

在我的WPF應用程序中,我想在非UI線程中做一些工作,以避免UI變得不響應。對於我這樣做:BeginInvoke()是否運行單獨的線程?

var caller = new AsyncMethodCaller<Pattern>(this.SetPatternType); 
caller.BeginInvoke(_patterns, null, null); 

和委託方被定義爲,

public delegate void AsyncMethodCaller<in T>(IEnumerable<T> data); 

我的問題是:

是否BeginInvoke()創建一個新的線程,並在其回調SetPatternType運行?如果是這樣,這個線程持續多久?

這是很好的做法,一般?如果沒有,它有什麼問題?我可能面臨的潛在問題是什麼?

我使用C#4.0和Visual Studio 2010中


編輯:

此外,我需要更多關於這幾個原則:

當我應該創建一個新的線程,我和時我應該使用BeginInvoke()嗎?何時應該使用DispatcherObject.Dispatcher.BeginInvoke()對象?

+0

你用什麼.NET版本? – PVitt 2011-04-07 08:09:27

+0

@PVitt:我想...我使用.NET 4.0,因爲我使用Visual Studio 2010. – Nawaz 2011-04-07 08:11:10

回答

10

它在技術上是not a new thread它的一個線程池線程,它的遷移持續時間比你的進程/程序更長,但可能會立即運行一些其他線程異步調用它完成你的。查看Asynch ProgrammingThreadpool上的MSDN文章以獲取完整的詳細信息。

,並根據瞭解更多詳細信息的興趣檢查I/O CompletionPort

非同步編程通常被認爲比ATLEAST同步碼好,但F你是在.NET 4.0看一看Task Parallel Library

基於問題編輯,我何時應該創建自己的線程? 與創建自己的線程相比,使用BeginInvoke或Async編程總是更好。當你確定需要一個專門的線程連續執行一些任務/工作時,嚴格地創建自己的線程,並且清楚瞭解應用程序中多個線程所需的同步機制。除非你有一個非常有說服力的理由,否則只要你可以避免創建新線程。你今天添加一個線程,並且可能繼續前進,兩年之後,三個開發人員看到爲一些連續的東西添加了一個額外的線程,他們將增加幾個線程,等等。相信我我已經看到了這種情況,因此設置了正確的做法(即使用Asynch方法),人們會試圖遵循這一點。我看過150線程的應用程序,在雙核或四核機器上有意義,我不這麼認爲。

剛纔檢查我的東芝筆記本電腦的所有正在運行的進程這樣的設計拙劣的應用程序,東芝藍牙管理器獲得使用53個線程我的盒子設計最糟糕的程序的桂冠。 :)

8

它使用線程池 - 所以它不一定會創建一個新的線程,但它運行在與調用線程不同的線程中(除非這是線程池線程本身恰好在委託調用是預定的;它將不太可能使用相同的線程)。

+1

你有什麼建議?這是一個好方法嗎?請參閱我的問題中的編輯。 – Nawaz 2011-04-07 08:14:39

+0

@Nawaz:這可能是最好留給一個單獨的問題。實際上,[何時使用線程池?](http://stackoverflow.com/questions/145304/when-to-use-thread-pool-in-c)可能會有所幫助。 – ladenedge 2011-04-07 08:29:11

+0

@Nawaz:你沒有真正說過目標是什麼,所以很難知道它是否是一個好方法。這與使用Dispatcher.BeginInvoke非常不同 - 這是在*特定*(UI)線程上執行委託。 – 2011-04-07 08:45:40

2

調度。CurrentDispatcher是WPF中的新東西(用於替換WinForms中的InvokeRequired東西)。

您可以使用調度排隊要在GUI任何更新,它有不同的優先級,你可以選擇從

看到this MSDN link

相關問題