2012-06-13 92 views
0

对不起,我不知道如何标题这个问题。MessageBox.Show和延期/延迟更新

我写了一个解释这个错误约10次,然后将其删除,因为它是不明确的 - 原谅我,我跳下直入代码,然后将解释

public MainWindow() 
    { 
     InitializeComponent(); 
     stuff(); 
    } 

    private void stuff() 
    { 
      DispatcherOperation disOp = Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(delegate 
       { 
        //PrintDialog dialog = new PrintDialog(); 
        //dialog.PrintVisual(canvas1, ""); 
       })); 

      string x = disOp.Status.ToString(); 
      MessageBox.Show(disOp.Status.ToString()); 
    } 

我已经逐步通过这个代码(Visual Studio中的F11),并且当它碰到行 disOp.Status.ToString()时,下一个F11跳转到预期的下一行。

但是,当我到达行MessageBox.Show(disOp.Status.ToString());并按F11时,它跳转到我的DispatcherOperation委托。

我的问题是为什么当我使用Messagebox控件而不是字符串时发生这种情况!?

(这实际上是确切的行为我需要,但我不想一个消息框出现,因为用户必须点击确定/取消......还能如何我复制这个?)

谢谢你

戴夫

+0

你说得对。你没有解释得很好。 :-)如果你不想要一个消息框出现,就不要调用MessageBox.Show()。至于为什么它们的行为不同:编译器可能会优化'string x'赋值语句,因为它在未被使用的情况下超出了范围。 'MessageBox.Show()'不会,因为它实际上做了一些事情。 –

回答

1

的BeginInvoke不会得到实际运行的动作,直到当前线程自由地处理悬而未决的MSG和消息框必须抽允许消息得到处理(有点像的DoEvents)。

+0

你不知道这实际上有多大帮助。真的,非常感谢你。 – Dave