[英]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.