多个Control.BeginInvoke / Invoke调用会按顺序执行吗?

时间:2009-12-10 13:07:26

标签: c# .net invoke begininvoke

我需要知道Control.BeginInvoke和Control.Invoke调用是否会按照调用它们的顺序执行。

我有以下情况:

  1. UI线程被阻止
  2. WCF线程调用Control.BeginInvoke
  3. WCF线程调用Control.Invoke(或可能再次使用BeginInvoke)
  4. UI线程已取消阻止
  5. ...
  6. 步骤1-4的执行顺序保证按所示顺序排列(从技术上讲,顺序不保证是这样,但我所拥有的问题仅在订单如图所示时才有意义。)

    我遇到的问题是,在步骤2中的BeginInvoke调用之前是否有可能执行步骤3中的Invoke / BeginInvoke调用?

    另外,请不要评论阻​​止UI线程。

4 个答案:

答案 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)

你没有机会可以假设,但是如果上面两个调用之间存在某种形式的依赖关系,那么它们会等待信号量并且只有在它们都完成时才执行相关代码。

如果您同时进行两次调用的原因不是性能,那么我可能只是在第一次调用中执行第二次调用(使调试更加容易)。