簡體   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