C#核心知識

委托

如何聲明一個委托:通過 【delegate 返回值類型 委托名稱】 的格式來定義

如何使用一個委托:使用new關鍵字,并傳入和聲明委托的構造相同的方法名,比如:new 委托名稱(與委托的參數和返回值相同的一個方法名)

如何調用一個委托:將new關鍵字返回的實例調用Invoke方法,或者像調用一個方法一樣調用它,就像方法一個調用都可以

什么是多播委托:顧名思義,多播委托可以注冊多個實現了委托的方法。

如何使用多播委托:通過+=,-=注冊,取消注冊委托

預定義委托:通過Action,Func來實現,他們的區別在于Action沒有返回值,Func有返回值,返回值在最后一個泛型里。

匿名函數經常和委托一起使用,語法:()=>{}

事件

事件是在委托的基礎上做的一個安全的處理,避免直接調用委托,而是通過+=,-=這種方式去注冊,取消注冊委托。并且在內部實現了線程安全的操作。

如果要研究源碼可以在SharpLab中看到用原始方法是如何實現了高級語法的。

多線程

什么是線程?

一個進程有多個線程,線程是操作系統中獨立運行的最小單位。

為什么要用多線程?

希望能同時運行多個任務,提高效率。

什么是線程池?

是一組預先創建的線程,可以被重復利用來執行任務。

什么是線程安全?

多個線程同時訪問共享資源時,對它的訪問不會產生數據不一致的后果。

同步機制:用于協調多個線程訪問的執行順序去訪問共享資源,避免數據不一致的問題。通過lock(obj){}的方式實現同步。

lock語法糖實際是對Monitor的一個封裝。

原子操作:在執行任務時要么全部執行,要么全部不執行,確保了數據的一致性。 通過Interlocked類實現原子操作

并行操作:使用并行操作(PLinq)可以大幅提高效率,使用AsParallel方法可以確保并行操作的執行。

如果前臺線程消亡,后臺線程也要跟著消亡,Main函數就是一個前臺線程。

如何創建一個線程?

new Thread(方法名稱).Start(方法的參數)

{

IsBackground = ,

....... // 配置

}

Join方法可以讓當前線程先執行完畢,確保后面的線程不會在它之前執行。

Interrupt可以中斷線程的執行

信號量(Semaphore):可以理解為高速公路的閘口和車道數,第一個參數控制開啟的閘口數,第二個參數控制車道數。

異步編程

異步不意味著多線程,單線程也可以是異步的。異步默認是使用線程池的,可以從線程ID中觀察的到,每次的ID都不一樣。

多線程適合CPU密集型的操作,適合長期運行的任務

異步適合IO密集型的操作,適合短暫的小任務,例如:服務器的后端接口;異步可以查看到線程執行的狀態。

異步任務的創建:

1、Task.Run()

2、Task.Factory.StartNew()

3、new Task().Start();

特性:

1、將方法標記為async后,方可在方法中使用await,還有一種同步的寫法但不推薦:InvokeTask().GetAwaiter().GetResult();

2、async+await會將方法包裝為狀態機

3、異步編程具有傳染性

async void這種寫法幾乎只用于對事件的注冊。

常見的阻塞情形:

1、Task.Wait() Task.Result如果任務沒有完成,則會阻塞當前線程,容易造成死鎖。

2、InvokeTask().GetAwaiter().GetResult(); 依舊是個阻塞寫法

3、Thread.Sleep(),使用異步時應該為Task.Delay(),這種寫法會立即釋放當前線程

4、IO耗時的操作

如何開啟多個異步任務?

Task.WhenAll(task),Task.WhenAny(task),不要在for循環中await。

如何取消異步任務?

使用CancellationToken實例的Cancel方法,同時配合IsCancellationRequested屬性可以在任務中精確控制是否繼續執行任務。

任務超時如何實現?

在創建CancellationTokenSource時傳入超時時間,比如:new CancellationTokenSource(2000);

注意事項

需要注意的是每次需要手動釋放CancellationTokenSource

??運算符,當左邊的參數不為空則返回它,如果為空則返回右邊的參數

有哪些同步機制?

SemaphoreSlim 推薦,用法簡單

Channel

第三方庫 - AsyncLock,比較復雜適用于大型項目

如何在在同步方法中調用異步?

1、應避免使用xxx.Wait(),xxx.Result,有可能導致死鎖,且無法捕獲異常。

2、應避免使用async void,無法捕獲到內部異常,內部不加異常捕獲會導致程序掛掉

3、InvokeTask().GetAwaiter().GetResult(); 可以捕獲到內部異常。

4、SafeFireForget:async void SafeFireForget(Task task, Action? completed, Action<Exception> expection),第一個參數是異步執行的業務方法,第二個參數是異步任務完成后的回調委托,第三個參數是異步任務出現異常的回調委托

5、ContinueWith:Job().ContinueWith(xxxTask),在異步任務完成后調用它的ContinueWith方法,參數是對任務完成與否的處理方法。

GC

.NET中將引用對象分為三類,第0代,第1代,第2代對象,一般會優先進行第0代回收, 然后將未成功回收的放到第1代中,如果第1代對象再次未回收成功會放到第2代中,這樣做可以減少回收的成本,提高效率。

在C#中,析構函數(也稱為終結器)主要用于釋放非托管資源(如文件句柄、數據庫連接、操作系統句柄等)。

class ResourceWrapper
{~ResourceWrapper() // 析構函數{// 釋放非托管資源CloseHandle(fileHandle);}
}

重要配置

在項目文件xxx.csproj中修改以下配置

工作站與服務器模式

工作站模式:適合內存占用小的程序和桌面應用,回收頻率高,是單線程的。

服務器模式:適合內存占用大的程序,回收頻率低,吞吐量高,是多線程的。

1、true - 服務器模式,false - 工作站模式

<ServerGarbageCollection>true</ServerGarbageCollection>

普通GC與后臺GC

普通GC:會導致單次停頓時間變長(例如UI線程的卡死),但消耗的資源少,支持壓縮處理。

后臺GC:單次停頓時間短,但停頓的頻率多,消耗的資源多,不支持壓縮處理。

2、true - 啟動后臺GC,false - 普通GC

<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77604.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

免費LUT網站

FREE LUTs | Color Lookup Tables - Presetpro.com

力扣-160.相交鏈表

題目描述 給你兩個單鏈表的頭節點 headA 和 headB &#xff0c;請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點&#xff0c;返回 null 。 圖示兩個鏈表在節點 c1 開始相交&#xff1a; 題目數據 保證 整個鏈式結構中不存在環。 注意&#xff0c;函數返…

架構風格對比

架構風格深度對比&#xff1a;從管道-過濾器到微內核 &#x1f4dc; 引言 在軟件架構設計中&#xff0c;不同的架構風格適用于不同的業務場景。本文將深入解析 7種主流架構風格&#xff0c;包括它們的核心思想、優缺點、適用場景&#xff0c;并通過對比表格和示例幫助您選擇最…

「Mac暢玩AIGC與多模態05」部署篇03 - 在 Mac 上部署本地向量化模型(Embedding Models)

一、概述 本篇介紹如何在 macOS 環境下,為 Dify 平臺部署本地向量化模型(Embedding Models),支持知識庫文檔向量化、語義檢索與智能體上下文增強。向量化模型是實現知識庫問答與 RAG(檢索增強生成)應用的基礎組件。 二、部署流程 1. 環境準備 確認 Docker Desktop 正常…

shell(3)

1.介紹 定義變量的規則 1.變量名稱可以由字母,數字和下劃線組成,但是不能以數字開頭. 5A200() 2.等號兩側不能有空格. 3.變量名稱一般習慣為大寫,這是一個規范. 2.將命令的返回值只賦給變量 1、A&#xff40;date&#xff40;反引號,運行里面的命令,并把結果返回給變量A. 注&a…

人智交互中的AI世代

人智交互中的AI世代 一、研究背景與意義 1.1 技術演進背景 人工智能技術自1956年達特茅斯會議提出概念以來&#xff0c;經歷了多次技術迭代與產業周期。2020年后&#xff0c;以大語言模型&#xff08;LLMs&#xff09;和生成式AI&#xff08;AIGC&#xff09;為代表的突破性進…

4.環境變量

目錄 1.并行與并發 2. 環境變量 2.1 舉例子 2.2 命令行參數 2.3 環境變量 1.并行與并發 并行&#xff1a;多個進程在多個CPU下分別、同時運行&#xff0c;稱為并行 并發&#xff1a;多個進程在一個CPU下采用進程切換的方式&#xff0c;在一時間段內&#xff0c;多個進程同…

Spring Boot 中使用 Feign 調用內網 IP 接口并記錄入參與出參

在微服務架構中&#xff0c;服務間的通信是常見的需求。Spring Cloud 提供的 Feign 客戶端是一個聲明式的 Web 服務客戶端&#xff0c;它使得服務間的調用變得非常簡單。然而&#xff0c;在實際開發中&#xff0c;我們可能需要調用內網 IP 地址的接口&#xff0c;并且希望記錄請…

【Java】 使用 HTTP 響應狀態碼定義web系統返回碼

系統狀態碼定義 public interface GlobalErrorCodeConstants {ErrorCode SUCCESS new ErrorCode(0, "成功");// 客戶端錯誤段 ErrorCode BAD_REQUEST new ErrorCode(400, "請求參數不正確");ErrorCode UNAUTHORIZED new ErrorCode(401, "賬號未登…

如何搭建spark yarn模式的集群

一、基礎環境準備 ?安裝JDK 1.8? 所有節點需安裝JDK并配置環境變量&#xff0c;確保JAVA_HOME正確指向安裝路徑14。?部署Hadoop集群? 安裝Hadoop&#xff08;推薦3.x版本&#xff09;&#xff0c;配置YARN資源管理器4。在yarn-site.xml中啟用資源調度&#xff1a; <pro…

python22-元組、列表、字典、集合推導式

課程&#xff1a;B站大學 記錄python學習&#xff0c;直到學會基本的爬蟲&#xff0c;使用python搭建接口自動化測試就算學會了&#xff0c;在進階webui自動化&#xff0c;app自動化 循環語句小作業 元組推導式列表推導式字典推導式實踐是檢驗真理的唯一標準 推導式 簡介 Pytho…

探索 CameraCtrl模型:視頻生成中的精確攝像機控制技術

在當今的視頻生成領域&#xff0c;精確控制攝像機軌跡一直是一個具有挑戰性的目標。許多現有的模型在處理攝像機姿態時往往忽略了精準控制的重要性&#xff0c;導致生成的視頻在攝像機運動方面不夠理想。為了解決這一問題&#xff0c;一種名為 CameraCtrl 的創新文本到視頻模型…

跨端開發技術總結

1.electron&#xff1a; 基于node.js 桌面端&#xff1a;window / linux / macos 手機端&#xff1a;無 頁面&#xff1a;網頁開發相關技術都可以 2.tauri 基于rust 桌面端&#xff1a;window / linux / macos 手機端&#xff1a;android / IOS 頁面&#xff1a;網頁開…

單片機-89C51部分:7、中斷

飛書文檔https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf 一、中斷的作用 中斷是為使單片機具有對外部或內部隨機發生的事件實時處理而設置的&#xff0c;中斷功能的存在&#xff0c;很大程度上提高了單片機處理外部或內部事件的能力。它也是單片機最重要的功…

0805登錄_注冊_token_用戶信息_退出-網絡ajax請求2-react-仿低代碼平臺項目

文章目錄 1 JWT1.1 JWT結構1.2 工作流程1.3 優點1.4 缺點1.5 安全實踐1.6. 適用場景1.7 JWT與OAuth2**8. 示例代碼&#xff08;Node.js&#xff09;** 2 用戶mock和api3 注冊4 登錄5 token存儲6 請求攔截器設置token6 獲取用戶信息7 退出登錄結語 1 JWT JSON Web Token&#x…

大模型入門

一、模型入門路徑 1. 學習預備知識 編程語言&#xff1a;熟練掌握Python編程語言&#xff0c;包括基本語法、數據結構&#xff08;列表、字典、元組等&#xff09;、面向對象編程、文件操作等。Python有豐富的機器學習和深度學習庫&#xff0c;方便進行大模型的開發和實驗。數…

把dll模塊注入到游戲進程的方法_插APC注入

一、概述 APC是異步過程調用,系統創建線程的時候會為線程創建一個APC隊列,當線程調用SleepEx,WaitSingleObjectEx等函數時,并把線程狀態被設置為可提醒狀態時,線程并不會睡眠,而是檢查APC隊列是否為空,如果不為空,轉去執行APC隊列中的每一項,因此給目標進程中的線程插…

git 如何清空當前分支的歷史提交記錄,僅保留最后一次提交

本方法基于新建 Git 孤立分支實現&#xff1a; 1. ??首先檢出待清理的分支 在 IDEA 右下角檢查當前分支名稱 或執行 git branch 確認。如果不在目標分支上&#xff0c;會顯示 (HEAD detached at xxxxx)&#xff0c;這時需要先切換分支&#xff1a; git checkout 原分支名 2.…

【C++】Googletest應用

Googletest 1 配置 使用cmake配置&#xff1a; 具體文件后面上傳補充 ./test.out --gtest_filterXXXTest.xxx 2 gdb 為了跟蹤流程&#xff0c;可以使用gdb&#xff1b; gdb ./xxx.out gdb --args ./gtest --gtest_filterxxx.xxx設置運行參數 set args --gtest_filterxxx.…

JavaScript:從DOM概述到window對象的常見事件

一、BOM概述 1.BOM的概念 BOM&#xff08;Browser Object Model&#xff09;即瀏覽器對象模型&#xff0c;它提供了獨立于內容而與瀏覽器窗口進行交互的對象&#xff0c;其核心對象是window 2.BOM的構成 BOM比DOM更大&#xff0c;它包含DOM window對象是瀏覽器的頂級對象&a…