前提条件是:Control的BeginInvoke是在UI线程上调用的,代码示例如下:
private delegate void beginInvokeDelegate();
private void beginInvokeMethod(){
//代码段C
}private void but_click(....){
//代码段A
this.BeginInvoke(new beginInvokeDelegate(beginInvokeMethod));
//代码段B
}
问题是ABC有没有严格的执行顺序。我认为是ABC
比如我代码段B写为MessageBox.Show("B");
代码段C写为MessageBox.Show("C");
这时会先弹出C,再弹出B.但我认为这是因为Show会弹出模态对话框如果我这样
private string result;
代码段B写result+= "B";
代码段C写result+="C";
结果就是BC
或者我在B和C初都sleep();
不管谁的时间长,都是B先执行。因此我想问下:
(1)问题是ABC有没有严格的执行顺序。
(2)如果有,怎么解释这3种情况呢。
(3)Invoke和BeginInvoke和UI的消息处理有什么关系吗?
希望大家讨论下,也帮菜鸟学习下。谢谢
另:我写了篇blog... whssunboy.cnblogs.com里边有比较详细的介绍
private delegate void beginInvokeDelegate();
private void beginInvokeMethod(){
//代码段C
}private void but_click(....){
//代码段A
this.BeginInvoke(new beginInvokeDelegate(beginInvokeMethod));
//代码段B
}
问题是ABC有没有严格的执行顺序。我认为是ABC
比如我代码段B写为MessageBox.Show("B");
代码段C写为MessageBox.Show("C");
这时会先弹出C,再弹出B.但我认为这是因为Show会弹出模态对话框如果我这样
private string result;
代码段B写result+= "B";
代码段C写result+="C";
结果就是BC
或者我在B和C初都sleep();
不管谁的时间长,都是B先执行。因此我想问下:
(1)问题是ABC有没有严格的执行顺序。
(2)如果有,怎么解释这3种情况呢。
(3)Invoke和BeginInvoke和UI的消息处理有什么关系吗?
希望大家讨论下,也帮菜鸟学习下。谢谢
另:我写了篇blog... whssunboy.cnblogs.com里边有比较详细的介绍
解决方案 »
- 散分!!一个进程多个用户 如何实现?
- 工具条中添加的toolStripComboBox1为何没有DataSource
- QQ服务器要和那么多客户端连接,服务器是怎么做到的?
- 想不通明白这到底是怎么回事?请高手指点一下.
- 求一条SQL语句的优化语句!急急急!!!
- 紧急求救高手,Word转PDF时,文件变的更大了,代码要怎么设置
- 用System.Diagnostics.Process .start()启动本地客户端程序,怎样把网页上的数据作为参数传给本地客户端程序??高手帮忙!!!!
- C#如何实现文件复制功能
- 请问怎么更改Bitmap中的调色板?
- 创建线程地程序是否不能跟参数?
- 怎么在MDI主窗体菜单中在运行时列出其子窗体
- 如果求bindingsource 绑定的对象,答对马上给分
BeginInvoke是异步执行的,相当于新开个线程去执行,而Invoke是同步的,要等到它执行完毕后才执行后面的代码。如果你将BeginInvoke改为Invoke,那么执行顺序一定是ACB
BeginInvoke的委托方法是执行在UI线程上的,和新线程没有关系吧。如果说没有执行顺序,那么有没有更好的原因呢,为什么没有顺序呢?
还有既然是新线程操作,不稳定是肯定的,不然我们多线程程序干吗还要同步和琐,大家都按照次序一个一个来好了。就因为不稳定所以才要程序员在代码上加以控制,这才是多线程程序的难点。
前提条件是:Control的BeginInvoke是在UI线程上调用的。
想告诉楼上一下,beginInvoke是不会新开线程的,所有对控件的调用都只能在创建控件句柄的线程上调用,beginInvoke只是把delegate封送给UI线程,单执行还是在UI线程上,只是说调用beginInvoke的是新线程
private Thread demoThread;
private delegate void demoDelegate;
private void DelegateMethod(){
}
private void StartMethod(){
this.BeginInvoke(new demeoDelegate(DelegateMethod0);
}private void button_click(...){
demoThread = new Thread(new ThreadStart(StartMethod));
demoThread.Start();
}
这样写的话,StartMethod是在新线程中执行,但是DelegateMethod依然在UI线程中,这个一篇文章http://www.cnblogs.com/Rustle/articles/11301.aspx讲的比较详细