我需要知道Control.BeginInvoke和Control.Invoke调用是否会按照调用它们的顺序执行。
我有以下情况:
步骤1-4的执行顺序保证按所示顺序排列(从技术上讲,顺序不保证是这样,但我所拥有的问题仅在订单如图所示时才有意义。)
我遇到的问题是,在步骤2中的BeginInvoke调用之前是否有可能执行步骤3中的Invoke / BeginInvoke调用?
另外,请不要评论阻止UI线程。
答案 0 :(得分:10)
在您的情况下,步骤2将始终在步骤3之前执行.UI线程上的BeginInvoke将按其排队的顺序执行。
UI线程实际上是一个消息泵,它有一个消息队列,只有一个线程消耗它,因此可以保证工作项按照它们排队的顺序执行。
使用Delegate.BeginInvoke,执行顺序可能是非顺序的。
答案 1 :(得分:3)
BeginInvoke调用在目标线程上排队(因为它们按到达顺序发布)。
可以在从该线程进行异步调用(步骤2)之前执行WCF线程上的同步调用(步骤3)。
答案 2 :(得分:0)
没有足够的信息给你一个好的答案。 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的调用。
答案 3 :(得分:0)
你没有机会可以假设,但是如果上面两个调用之间存在某种形式的依赖关系,那么它们会等待信号量并且只有在它们都完成时才执行相关代码。
如果您同时进行两次调用的原因不是性能,那么我可能只是在第一次调用中执行第二次调用(使调试更加容易)。