2010-09-17 54 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