例子我稍后贴上,有懂的能否先回答一下?

解决方案 »

  1.   

    下面代码,备注:
    MainWindowLoaded函数,是主窗体的加载函数。
    delay_zusai函数,是一个Button来触发的。
    我想问的是:System.Windows.MessageBox.Show("123", "abc");这行代码运行后,UI线程进入了阻塞状态。那么,为什么t1线程不断发过来的委托(颜色变化),还能够响应?private void MainWindowLoaded(object sender, RoutedEventArgs e)
    {            System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ThreadStart(delegate() { changecolor(); }));
                t1.IsBackground = true;
                t1.Start();     }        private void delay_zusai(object sender,RoutedEventArgs args)
            {
                System.Windows.MessageBox.Show("123", "abc");
                this.Title = "haha";
            }        private void changecolor()
            {
                int i = 0;
                while (true)
                {
                    System.Threading.Thread.Sleep(1000);
                    this.Change_Background(((i++ % 2 == 0) ? "Green" : "Red"));
                }
            }        delegate void Change_Background_Handle(string String_Color);
            void Change_Background(string String_Color)
            {
                if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
                {
                    this.Dispatcher.Invoke(new Change_Background_Handle(this.Change_Background), String_Color);
                }
                else
                {
                    this.Background = new System.Windows.Media.SolidColorBrush((System.Windows.Media.Color)(System.Windows.Media.ColorConverter.ConvertFromString(String_Color)));
                }
            }
      

  2.   

    MessageBox.Show虽然显示模式窗口,但消息泵还再运行(模式窗口也需要消息泵)。
    消息泵的运行,使得Invoke有机会得到执行。
      

  3.   

    但是,消息泵是一个消息执行完毕后,才能执行下一个消息
    MessageBox没有被退出前,怎么下一个消息,怎么可能被执行?你可以注意代码中还有一句:this.Title = "haha";
    这句代码,在MessageBox被退出前,都没有被执行。
      

  4.   

    继续顶顶。
    谁能解释一下,点击按钮触发后,在MessageBox退出前,为什么:
    this.Title="haha";这句不能被执行?而颜色转换的委托事件,却可以不断地被执行?
      

  5.   

    因为this.Title = "haha"没有机会进入消息泵。
    你把它放到你的线程里,Title就会改变。
    记住没有消息泵,MessageBox就不能更新自己,就不能响应按钮点击。你可以把MessageBox.Show想象成如下代码:EnableWindow(hParent, FALSE);          //1
    while( GetMessage(&msg, NULL, 0, 0) )  //2
    {
       if( !quitDialg && !IsDialogMessage(hCurrentDlg, &msg) )  //3
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);           //4
       }
    }
    EnableWindow(hParent, TRUE);//C#
    this.Title = "haha";1、禁用父窗口(因此点击父窗口等无效),
    2、开始Modal消息泵循环,
    3、如果是对消息框的操作,发送到消息框(相应消息框移动,消息框按钮点击等等...)
    4、如果是非消息框消息,进行消息派送(其他线程发来的Invoke消息因此得到处理)循环到消息框被关闭为止。
    然后this.Title="haha"才有机会得到执行。
      

  6.   

    首先这个UI线程并没有被阻塞,其次this.Title = "haha"并不是消息
      

  7.   

    UI线程为什么没有被阻塞?我点击按钮后,程序UI线程就会执行函数:delay_zusai()这个函数。
    然后,运行MessageBox。
    那么,按道理接下来就是运行this.Title="haha"。但是this.Title="haha",就是不出来,这样不是证明,UI线程阻塞在MessageBox那里了吗?
      

  8.   

    我已经明白你的意思了。你把System.Windows.MessageBox.Show("123", "abc");的过程展开了,然后就非常清晰了。