[英]Will multiple Control.BeginInvoke/Invoke calls execute in order?
我需要知道Control.BeginInvoke和Control.Invoke调用是否将按照调用的顺序执行。
我有以下场景:
步骤1-4的执行顺序保证按所示顺序排列(从技术上讲,订单不保证是这样的,但我所拥有的问题仅在订单如图所示时才相关)。
我的问题是,在步骤2中的BeginInvoke调用之前是否有可能执行步骤3中的Invoke / BeginInvoke调用?
另外,请不要评论阻止UI线程。
在您的情况下,步骤2将始终在步骤3之前执行.UI线程上的BeginInvoke将按其排队的顺序执行。
UI线程实际上是一个消息泵,它有一个消息队列,只有一个线程消耗它,所以它保证工作项将按它们排队的顺序执行。
使用Delegate.BeginInvoke,执行顺序可能是非顺序的。
BeginInvoke调用在目标线程上排队(因为它们按到达顺序发布)。
可以在从该线程进行异步调用(步骤2)之前执行WCF线程上的同步调用(步骤3)。
没有足够的信息给你一个很好的答案。 UI线程被阻止,因此步骤2和3必须在不同的线程上运行。 如果两者之间没有同步,那么我们怎么知道任何排序?
Thread 1 Thread 2 Thread 3 Thread 4
Block UI Calls BeginInvoke
Unblock UI Calls Invoke or BeginInvoke BeginInvoke runs BeginInvoke runs
你已经有了很多并行性,但是根据你所描述的,我们没有办法告诉你可能会出现什么样的排序,没有说“任何东西”。 我们甚至不能告诉您,在UI线程被阻止之前或在UI线程被解除阻塞之后,不会发生对BeginInvoke的调用。
没有机会你可以假设,但如果上面两个调用之间存在某种形式的依赖关系,它们会等待信号量,并且只有在它们完成时才执行相关代码。
如果您同时进行两次调用的原因不是性能,那么我可能只是在第一次调用中执行第二次调用(使调试更加容易)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.