[quote=引用 9 楼 crystal_lz 的回复:] [quote=引用 6 楼 phommy 的回复:] 当在主线程里BeginInvoke时,顺序永远是ACB BeginInvoke原理是向自己发送一条消息,当前方法执行完之前,程序是没有机会跑到消息回圈的 一个例外:如果C中包含Application.DoEvents,则C执行过程中就会去执行B了,顺序是ACBC 如果是在工作线程调用BeginInvoke就很难说了,只能保证先BeginInvoke的语句先被执行,因为消息回圈会按收到消息的顺序处理消息。不过我解释不了为什么4L的实验1得到了非常有规律的结果
[quote=引用 6 楼 phommy 的回复:] 当在主线程里BeginInvoke时,顺序永远是ACB BeginInvoke原理是向自己发送一条消息,当前方法执行完之前,程序是没有机会跑到消息回圈的 一个例外:如果C中包含Application.DoEvents,则C执行过程中就会去执行B了,顺序是ACBC 如果是在工作线程调用BeginInvoke就很难说了,只能保证先BeginInvoke的语句先被执行,因为消息回圈会按收到消息的顺序处理消息。不过我解释不了为什么4L的实验1得到了非常有规律的结果
当在主线程里BeginInvoke时,顺序永远是ACB BeginInvoke原理是向自己发送一条消息,当前方法执行完之前,程序是没有机会跑到消息回圈的 一个例外:如果C中包含Application.DoEvents,则C执行过程中就会去执行B了,顺序是ACBC 如果是在工作线程调用BeginInvoke就很难说了,只能保证先BeginInvoke的语句先被执行,因为消息回圈会按收到消息的顺序处理消息。不过我解释不了为什么4L的实验1得到了非常有规律的结果
你这个写法和直接 this.Invoke有区别没?
答案:ACB 只有当调用的子线程执行完毕后,才会轮到异步委托方法执行。 不够,你可以使用EndInvoke,检索由传递的 IAsyncResult 表示的异步操作的返回值来让B在C之前执行: this.EndInvoke(this.BeginInvoke(new Action(() => { Go++; //B语句 }))); 这样的结果是ABC
110,571
社区成员
642,568
社区内容
加载中
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧