繁体   English   中英

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

[英]Will multiple Control.BeginInvoke/Invoke calls execute in order?

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

我有以下场景:

  1. UI线程被阻止
  2. WCF线程调用Control.BeginInvoke
  3. WCF线程调用Control.Invoke(或者可能再次使用BeginInvoke)
  4. UI线程已解除阻止
  5. ??

步骤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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM