2010-09-17 53 views
2

我對WPF比較陌生。我檢查了一些代碼,看起來像這樣:關於從同一個線程調用WPF Dispatcher.BeginInvoke的問題!爲什麼?

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    //Queue on dispatcher in the background so it doesn't make the UI slow 
     Dispatcher.BeginInvoke(new dMyDelegate(PerformOperation), DispatcherPriority.Background); 
} 

從評論,我猜的原代碼認爲這是必要的,使用戶界面更加敏感,但是,我的理解是,Dispatcher.BeginInvoke只需在UI線程上運行一些東西。由於buttn_Click已經在UI線程上,這有什麼意義?也許我誤解了Dispatcher和BeginInvoke。我在這裏假設Dispatcher是這個方法所在類的調度器,它是MainWindow.xaml。有人能夠啓發我嗎?

感謝

回答

5

那麼,它要求「背景」的優先級,所以它一定會在任何重要事件已被處理,以得到執行......如果這是一個很大的屏幕刷新的一部分,它會有效地等到所有這些都發生在執行之前。即使如此,如果它要做長時間運行(或者做出任何潛在的阻塞調用),那麼你是對的,它實際上不應該在UI線程上運行。

+0

啊。我沒有專注於第二個參數。這就說得通了。 「PerformOperation」將在所有正常優先級事件後被調用。在代碼中的其他地方,他們還將「背景」稱爲BeginInvoke,並且不涉及讓GUI首先重繪。你碰巧知道屏幕重繪的水平是什麼?那是如果我用MSWord阻止和解除應用程序或最小化和最大化?是「正常」還是更高?最後,似乎一旦PerformOperation開始,GUI被鎖定?正確? – Dave 2010-09-17 19:53:02

+0

@Andrew:恐怕我不知道優先級......但是,一旦PerformOperation啓動,調度程序線程將被鎖定。我相信這裏有一個單獨的渲染線程,可以避免出現空白屏幕,但我對這裏的細節知之甚少。 – 2010-09-17 20:23:47

+0

謝謝!標記爲答案。 – Dave 2010-09-19 14:13:33