为什么UI线程进入了阻塞状态,还能响应并执行其它线程的委托事件? 例子我稍后贴上,有懂的能否先回答一下? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 下面代码,备注: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))); } } MessageBox.Show虽然显示模式窗口,但消息泵还再运行(模式窗口也需要消息泵)。消息泵的运行,使得Invoke有机会得到执行。 但是,消息泵是一个消息执行完毕后,才能执行下一个消息MessageBox没有被退出前,怎么下一个消息,怎么可能被执行?你可以注意代码中还有一句:this.Title = "haha";这句代码,在MessageBox被退出前,都没有被执行。 继续顶顶。谁能解释一下,点击按钮触发后,在MessageBox退出前,为什么:this.Title="haha";这句不能被执行?而颜色转换的委托事件,却可以不断地被执行? 因为this.Title = "haha"没有机会进入消息泵。你把它放到你的线程里,Title就会改变。记住没有消息泵,MessageBox就不能更新自己,就不能响应按钮点击。你可以把MessageBox.Show想象成如下代码:EnableWindow(hParent, FALSE); //1while( 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"才有机会得到执行。 首先这个UI线程并没有被阻塞,其次this.Title = "haha"并不是消息 UI线程为什么没有被阻塞?我点击按钮后,程序UI线程就会执行函数:delay_zusai()这个函数。然后,运行MessageBox。那么,按道理接下来就是运行this.Title="haha"。但是this.Title="haha",就是不出来,这样不是证明,UI线程阻塞在MessageBox那里了吗? 我已经明白你的意思了。你把System.Windows.MessageBox.Show("123", "abc");的过程展开了,然后就非常清晰了。 WCF 10049: 在其上下文中,该请求的地址无效,急急急! access数据库反查询(高分100) 不同窗体间的数据传送 DateTimePicker控件在选择日期后,为什么时间不改变?请教如何让时间也为当前时间? Application与ApplicationClass的区别 散分,顺便带个问题 安装vs.net2005的问题急!!! 想了解下C#,请推荐本书 C#没前途?真:假 关于C#调用DLL的一些问题。 关于SQL查询结果中增加空行,求高手帮忙啊 哪位给我讲解一下这段代码运行后的结果。。。
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)));
}
}
消息泵的运行,使得Invoke有机会得到执行。
MessageBox没有被退出前,怎么下一个消息,怎么可能被执行?你可以注意代码中还有一句:this.Title = "haha";
这句代码,在MessageBox被退出前,都没有被执行。
谁能解释一下,点击按钮触发后,在MessageBox退出前,为什么:
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"才有机会得到执行。
然后,运行MessageBox。
那么,按道理接下来就是运行this.Title="haha"。但是this.Title="haha",就是不出来,这样不是证明,UI线程阻塞在MessageBox那里了吗?