C#Delegate和Control中Invoke和BeginInvoke區別

来源:https://www.cnblogs.com/wangyuhang-first/archive/2022/05/06/16228339.html
-Advertisement-
Play Games

C#Delegate和Control中Invoke和BeginInvoke區別 最近總是遇到Control的Invoke和BeginInvoke問題,故作此總結。 **1、**Control的Invoke和BeginInvoke的委托方法是在主線程,即UI線程上執行的。也就是說如果你的委托方法比較耗 ...


C#Delegate和Control中Invoke和BeginInvoke區別

最近總是遇到Control的Invoke和BeginInvoke問題,故作此總結。

1、Control的Invoke和BeginInvoke的委托方法是在主線程,即UI線程上執行的。也就是說如果你的委托方法比較耗時的操作,然後更新界面什麼的,千萬別在UI線程上調用Control.Invoke和Control.BeginInvoke,因為這些是依然阻塞UI線程的,造成界面的假死。
2、在Control中,非同步是指相對於調用BeginInvoke的線程非同步,而不是相對於UI線程非同步,你在UI線程上調用BeginInvoke ,沒有什麼作用,如果我們開一個線程,讓線程執行一些耗費時間的操作,然後再用Control.Invoke和Control.BeginInvoke回到用戶UI線程,執行界面更新。
3、Delegate.BeginInvoke方法是從Thread Pool中取出一個線程來執行這個方法,從而獲得非同步效果的。通過一個委托來進行同步方法的非同步調用,也是.net提供的非同步調用機制之一。但是Delegate.BeginInvoke方法是從ThreadPool取出一個線程來執行這個方法,以獲得非同步執行效果的。也就是說,如果採用這種方式提交多個非同步委托,那麼這些調用的順序無法得到保證。而且由於是使用線程池裡面的線程來完成任務,使用頻繁,會對系統的性能造成影響。
Delegate.BeginInvoke也是講一個委托方法封送到其它線程,從而通過非同步機制執行一個方法。調用者線程則可以在完成封送以後去繼續它的工作。但是這個方法封送到的最終執行線程是運行庫從ThreadPool裡面選取的一個線程。
這裡需要糾正一個誤區,那就是Control類上的非同步調用BeginInvoke並沒有開闢新的線程完成委托任務,而是讓界面控制項的所屬線程完成委托任務的。看來非同步操作就是開闢新線程的說法不一定准確。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個工作七年的小伙伴,竟然不知道”wait”和“notify”為什麼要在Synchronized代碼塊裡面。 好吧,如果屏幕前的你也不知道,請在評論區打上”不知道“。 對於這個問題,我們來看看普通人和高手的回答。 普通人: 額。。。。。。。。。。。。 高手: wait和notify用來實現多線程之間 ...
  • 前言 昨天在跟小伙伴聊天,當他談起自己正在做的項目時,一臉愁容。 他吐槽道:“該項目的 Python 代碼庫由多個人共同維護。由於每個人使用的編輯器不同,每個人的編碼風格也不同,最終導致了 代碼的縮進千奇百怪:有縮進 2 個空格的,有縮進 4 個空格的,有縮進 8 個空格,有縮進一個 Tab 的,更 ...
  • 來源:cnblogs.com/juncaoit/p/12422752.html 一直以為這個方法是java8的,今天才知道是是1.7的時候,然後翻了一下源碼。 這篇文章中會總結一下與a.equals(b)的區別,然後對源碼做一個小分析。 值是null的情況 1、a.equals(b), a 是nul ...
  • Java 17推出的新特性Sealed Classes經歷了2個Preview版本(JDK 15中的JEP 360、JDK 16中的JEP 397),最終定稿於JDK 17中的JEP 409。Sealed Classes有兩種主流翻譯:密封類、封閉類。個人喜歡前者多一些,所以在本文中都稱為密封類。其 ...
  • 排序 比較 分類 比較排序的時間複雜度的下界O(nlogn) 對於n個待排序元素,在未比較時,可能的正確結果有n!種。在經過一次比較後,其中兩個元素的順序被確定,所以可能的正確結果剩餘n!/2種(確定之前兩個元素的前後位置的情況是相同,確定之後相當於少了一半的可能性)。依次類推,直到經過m次比較,剩 ...
  • 字元串 String s1 = "aaa"; String s2 = "aa" + new String("a"); String s3 = new String("aaa"); System.out.println(s1.intern().equals(s1)); //true System.ou ...
  • 位運算 >>> 無符號右移,第一位符號位不變,其他位用0補齊 >> 右移,整體右移,左邊的用0補齊 << 左移,整體左移,右邊的用0補齊 | 或:有1則1 & 與:有0則0 ^ 異或:相反為1,否則為0 ~ 取反: 寫個測試 1.5以後的jdk中,Integer等數字類型內部維護了一個成員變數叫 S ...
  • 前言 實際項目中總能遇到一個"組件"不是基礎組件但是又會頻繁複用的情況,在開發MASA Auth時也封裝了幾個組件。既有簡單定義CSS樣式和界面封裝的組件(GroupBox),也有帶一定組件內部邏輯的組件(ColorGroup)。 本文將一步步演示如何封裝出一個如下圖所示的ColorGroup組件, ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...