C# 線程交互

一、為什么要進行線程交互

C#中,線程交互通常涉及到多個線程之間的數據共享和同步?.

一、全局變量

C#中,全局變量是指在程序的任何地方都可以訪問的變量。通常,全局變量是在類的外部定義的,或者在所有方法之外定義的。全局變量通常用于存儲需要在多個方法或類之間共享的數據。

1. 在類外部定義

你可以在類定義之外定義全局變量,但這通常不推薦,因為這違背了面向對象編程的原則,即封裝性。更好的做法是使用靜態成員(靜態變量)或單例模式來共享數據。

靜態變量

靜態變量屬于類,而不是類的實例。這意味著你可以通過類名直接訪問它,而不需要創建類的實例。

2. 使用單例模式

單例模式確保一個類只有一個實例,并提供一個全局訪問點。

3. 在類內部作為字段使用(非靜態)

如果你想在多個方法之間共享數據,但又不想讓這個數據成為公共的(即不想讓其他類直接訪問),可以將它定義為類的字段,并通過實例方法訪問。雖然這不是真正的“全局”訪問,因為它需要通過類的實例訪問,但它仍然可以在多個方法間共享數據。

最佳實踐和建議:

封裝性:盡量使用封裝性原則,通過屬性、方法或單例模式來控制數據的訪問。

可維護性:過度使用全局變量會使代碼難以維護和理解。盡量減少全局變量的使用,特別是在大型項目中。考慮使用依賴注入等設計模式來管理依賴和共享數據。

線程安全:當涉及到多線程時,確保全局變量的訪問是線程安全的。可以通過lock語句或者使用Concurrent集合來處理。

二、AutoResetEvent

AutoResetEvent 是一種同步原語,它允許一個線程等待另一個線程發出信號。當一個線程調用 WaitOne() 方法時,它會被阻塞直到另一個線程調用 Set() 方法為止。每次 Set() 被調用后,AutoResetEvent 將自動重置為非信號狀態,這意味著只能喚醒一個等待的線程。

三、 ManualResetEvent

AutoResetEvent 類似,ManualResetEvent 允許一個或多個線程等待某個事件的發生。不同的是,ManualResetEvent Set() 被調用之后不會自動重置,除非顯式地調用了 Reset() 方法。

四、事件(Event)機制

通過事件和委托機制,可以在對象之間發送消息并通知訂閱者。這種模式非常適合需要跨多個線程進行通信的情況,尤其是在圖形用戶界面(GUI)應用中,主線程通常用于UI更新,而子線程則處理后臺任務。

五、Monitor

一、Monitor 類概述

Monitor 類位于 System.Threading 命名空間中,它允許你對對象進行鎖定(即獲取互斥鎖),從而確保在同一時刻只有一個線程可以執行被鎖定保護的代碼塊。

1. 基本鎖機制

??? Monitor.Enter Monitor.Exit 用于保護臨界區,確保線程互斥訪問共享資源。

??? 與 lock 的關系:lock 關鍵字是 Monitor 的語法糖,編譯后等價于 try-finally 塊包裹的 Enter Exit

??? 何時用 Monitor:需要超時控制或非阻塞嘗試獲取鎖時(通過 TryEnter)。

2. 常用方法

??? Enter:嘗試進入臨界區并獲取鎖。

??? Exit:釋放鎖并退出臨界區。

??? TryEnter:嘗試進入臨界區并在指定時間內等待鎖。

??? Wait:釋放當前線程持有的鎖,并將該線程放入等待隊列。

??? Pulse/PulseAll:通知等待隊列中的一個或所有線程鎖已釋放,它們可以重新競爭鎖。

3. 使用場景

??? 保護共享資源:確保多個線程不會同時修改同一數據結構。

??? 生產者-消費者模式:協調生產者和消費者之間的操作。

??? 條件變量:實現基于條件的同步。

六、 InvokeBeginInvoke

Invoke BeginInvoke C#中主要用于跨線程操作UI控件,確保線程安全。?

InvokeBeginInvoke的作用

?1、線程安全問題?:在Windows GUI編程中,UI元素只能在創建它們的線程上訪問。如果在一個非UI線程中直接操作UI控件,可能會導致?? 異常。InvokeBeginInvoke方法用于在正確的線程上執行代碼,避免這種問題。

?2、同步與異步?:

?Invoke?:同步調用,當前線程會阻塞,直到委托在目標線程(通常是UI線程)上執行完畢。適用于需要確保被調用的代碼執行完成后,再繼續執行后續邏輯的場景。

?BeginInvoke?:異步調用,當前線程不會阻塞,委托會立即被加入目標線程的消息隊列,由目標線程異步執行。適用于不關心被調用代碼的執行結果,或希望避免阻塞當前線程的場景。

B站? :道傳科技上位機? ?觀看教程視頻

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

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

相關文章

Cursor 編輯器中的 Notepad 功能使用指南

Cursor 編輯器中的 Notepad 功能使用指南 摘要 本指南全面介紹了 Cursor 編輯器中的 Notepad 功能,涵蓋其用途、多種訪問方式、適用場景以及與其它功能的整合技巧等內容,助力用戶高效利用該功能提升工作流程效率。 不同訪問方式介紹 功能概述 Curso…

用于評估大語言模型(LLMs)能力的重要基準任務(Benchmark)

基準任務涵蓋了 多領域(如語言理解、數學、推理、編程、醫學等)和 多能力維度(如事實檢索、計算、代碼生成、鏈式推理、多語言處理)。常用于模型發布時的對比評測,例如 GPT-4、Claude、Gemini、Mistral 等模型的論文或…

力扣HOT100之技巧:169. 多數元素

這道題如果不考慮空間復雜度和時間復雜度的限制的話很好做,一種思路是通過一次遍歷將所有元素的數量記錄在一個哈希表中,然后我們直接返回出現次數最多的鍵即可。另一種思路是直接對數組進行排序,數組中間的值一定是多數元素,因為…

wordpress首頁調用指定ID頁面內的相冊

要在WordPress首頁調用ID為2的頁面中的相冊,你可以使用以下幾種方法: 方法一:使用短代碼和自定義查詢 首先,在你的主題的functions.php文件中添加以下代碼: function display_page_gallery($atts) {$atts shortcod…

基于深度學習的異常檢測系統:原理、實現與應用

前言 在現代數據驅動的業務環境中,異常檢測(Anomaly Detection)是一個關鍵任務,它能夠幫助企業和組織及時發現數據中的異常行為或事件,從而采取相應的措施。異常檢測廣泛應用于金融欺詐檢測、網絡安全、工業設備故障監…

Java基于BS架構的OA流程可視化實戰:從工作流引擎到前端交互(附完整源代碼+論文框架)

一、引言:BS架構OA系統的流程可視化需求 在企業信息化建設中,基于瀏覽器/服務器(BS)架構的OA系統通過流程自動化提升辦公效率,而流程可視化是實現流程監控、優化的核心模塊。本文基于Java技術棧,結合Activ…

JavaWeb-數據庫連接池

目錄 1.springboot默認Hikari(追光者)連接池 2.切換為Druid(德魯伊)連接池 1.springboot默認Hikari(追光者)連接池 2.切換為Druid(德魯伊)連接池 一般幾乎用不到&#xff0c;不需要切換 <!--Druid連接池--> <dependency><groupId>com.alibaba</groupId&…

c# 完成恩尼格瑪加密擴展

c# 完成恩尼格瑪加密擴展 恩尼格瑪擴展為可見字符恩尼格瑪的設備原始字符順序轉子的設置反射器的設置連接板的設置 初始數據的設置第一版 C# 代碼第二版 C# 代碼 總結 恩尼格瑪 在之前&#xff0c;我們使用 python 實現了一版恩尼格瑪的加密算法&#xff0c;但是這一版&#x…

【Redisson】鎖可重入原理

目錄 一、基本原理 二、源碼解析&#xff1a; &#xff08;2&#xff09;獲取鎖 &#xff08;1&#xff09;釋放鎖&#xff1a; 之前給大家介紹過redisson的分布式鎖&#xff0c;用redisson來實現比自己手搓簡單的分布式鎖有很多好處&#xff0c;因為這些可重入、可重試的邏…

BERT 模型微調與傳統機器學習的對比

BERT 微調與傳統機器學習的區別和聯系&#xff1a; 傳統機器學習流程 傳統機器學習處理文本分類通常包含以下步驟&#xff1a; 特征工程&#xff1a;手動設計特征&#xff08;如 TF-IDF、詞袋模型&#xff09;模型訓練&#xff1a;使用分類器&#xff08;如 SVM、隨機森林、邏…

(12)-Fiddler抓包-Fiddler設置IOS手機抓包

1.簡介 Fiddler不但能截獲各種瀏覽器發出的 HTTP 請求&#xff0c;也可以截獲各種智能手機發出的HTTP/ HTTPS 請求。 Fiddler 能捕獲Android 和 Windows Phone 等設備發出的 HTTP/HTTPS 請求。同理也可以截獲iOS設備發出的請求&#xff0c;比如 iPhone、iPad 和 MacBook 等蘋…

芯科科技Tech Talks技術培訓重磅回歸:賦能物聯網創新,共筑智能互聯未來

聚焦于Matter、藍牙、Wi-Fi、LPWAN、AI/ML五大熱門無線協議與技術 為年度盛會Works With大會賦能先行 隨著物聯網&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;越來越多的企業和個人開發者都非常關注最新的無線連接技術和應用…

docker-compose容器單機編排

docker-compose容器單機編排 開篇前言 隨著網站架構的升級&#xff0c;容器的使用也越來越頻繁&#xff0c;應用服務和容器之間的關系也越發的復雜。 這個就要求研發人員能更好的方法去管理數量較多的服務器&#xff0c;而不能手動挨個管理。 例如一個LNMP 架構&#xff0c;就…

LeetCode--29.兩數相除

解題思路&#xff1a; 1.獲取信息&#xff1a; 給定兩個整數&#xff0c;一個除數&#xff0c;一個被除數&#xff0c;要求返回商&#xff08;商取整數&#xff09; 限制條件&#xff1a;&#xff08;1&#xff09;不能使用乘法&#xff0c;除法和取余運算 &#xff08;2&#…

中山大學GaussianFusion:首個將高斯表示引入端到端自動駕駛多傳感器融合的新框架

摘要 近年來由于端到端自動駕駛極大簡化了原有傳統自動駕駛模塊化的流程&#xff0c;吸引了來自工業界和學術界的廣泛關注。然而&#xff0c;現有的端到端智駕算法通常采用單一傳感器&#xff0c;使其在處理復雜多樣和具有挑戰性的駕駛場景中受到了限制。而多傳感器融合可以很…

《哈希算法》題集

1、模板題集 滿足差值的數字對 2、課內題集 字符統計 字符串統計 優質數對 3、課后題集 2006 Equations k倍區間 可結合的元素對 滿足差值的數字對 異常頻率 神秘數對 費里的語言 連連看 本題集為作者&#xff08;英雄哪里出來&#xff09;在抖音的獨家課程《英雄C入門到精…

Cordova移動應用對云端服務器數據庫的跨域訪問

Cordova移動應用對云端服務器數據庫的跨域訪問 當基于類似 Cordova這樣的跨平臺開發框架進行移動應用的跨平臺開發時&#xff0c;往往需要訪問部署在公網云端服務器上的數據庫&#xff0c;這時就涉及到了跨域數據訪問的問題。 文章目錄 Cordova移動應用對云端服務器數據庫的跨…

mysql知識點3--創建和使用數據庫

mysql知識點3–創建數據庫 創建數據庫 在MySQL中創建數據庫使用CREATE DATABASE語句。語法如下&#xff1a; CREATE DATABASE database_name;其中database_name為自定義的數據庫名稱。例如創建名為test_db的數據庫&#xff1a; CREATE DATABASE test_db;可以添加字符集和排…

林業資源多元監測技術守護綠水青山

在云南高黎貢山的密林中&#xff0c;無人機群正以毫米級精度掃描古樹年輪&#xff1b;福建武夷山保護區&#xff0c;衛星遙感數據實時追蹤著珍稀動植物的棲息地變化&#xff1b;海南熱帶雨林里&#xff0c;AI算法正從億萬條數據中預測下一場山火的風險……這些科幻場景&#xf…

一階/二階Nomoto模型(野本模型)為何“看不到”船速對回轉角速度/角加速度的影響?

提問 圖中的公式反映的是舵角和力矩之間的關系&#xff0c; 其中可以看到力矩&#xff08;可以理解為角加速度&#xff09;以及相應導致的回轉角速度和當前的舵速&#xff08;主要由船速貢獻&#xff09;有關&#xff0c;那么為什么一階Nomoto模型&#xff08;一階野本&#xf…