狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 中的Sleep()與Wait()的區(qū)別

admin
2024年9月6日 11:41 本文熱度 585

摘要


在C#中,Thread.Sleep()Monitor.Wait()都是用于暫停當(dāng)前線程的執(zhí)行的方法,但它們的用途和行為有著本質(zhì)的不同。了解這些差異對于編寫高效且無錯誤的多線程程序至關(guān)重要。

正文


Thread.Sleep()

Thread.Sleep()是一個靜態(tài)方法,用于暫停當(dāng)前正在執(zhí)行的線程指定的時間段。在這段時間內(nèi),線程不會執(zhí)行任何操作。它只是簡單地使當(dāng)前線程進(jìn)入阻塞狀態(tài),不進(jìn)行任何CPU工作,直到指定的時間過去。

應(yīng)用場景

  1. 簡單的線程暫停:當(dāng)你只需要暫停線程一段時間,而不需要在這段時間內(nèi)進(jìn)行任何同步操作。

  2. 輪詢:如果你需要在檢查某個條件之間進(jìn)行短暫的暫停。

例子

using System;using System.Threading;
class Program{      static void Main()      {            Console.WriteLine("Sleeping for 2 seconds...");            Thread.Sleep(2000); // 暫停2秒            Console.WriteLine("Hi!");      }}

Monitor.Wait()

Monitor.Wait()是一個用于線程同步的方法。它釋放對象上的鎖,并且使當(dāng)前線程等待,直到其他線程調(diào)用Monitor.Pulse()Monitor.PulseAll()方法來通知等待的線程繼續(xù)執(zhí)行。Monitor.Wait()通常與Monitor.Pulse()Monitor.PulseAll()一起使用,作為線程間通信的機(jī)制。

應(yīng)用場景

  1. 線程間的協(xié)作:當(dāng)多個線程需要在某些操作完成后才能繼續(xù)執(zhí)行時。

  2. 生產(chǎn)者-消費(fèi)者問題:一個或多個線程在生成數(shù)據(jù),而另一個或多個線程在消費(fèi)這些數(shù)據(jù)。

例子

using System;using System.Threading;
class Program{      // 定義一個鎖對象,用于線程同步      static readonly object _locker = new object();
     // 標(biāo)志變量,用于控制線程的行為      static bool _go;
     static void Main()      {            // 啟動一個新的線程,該線程將執(zhí)行Work方法            new Thread(Work).Start();
           Console.WriteLine("Press Enter to signal worker...");            Console.ReadLine(); // 等待用戶輸入,模擬某個事件的發(fā)生
           // 獲取鎖,確保在修改共享資源時沒有其他線程可以訪問            lock (_locker)            {                  // 設(shè)置標(biāo)志變量為true,表示可以繼續(xù)執(zhí)行                  _go = true;
                 // 發(fā)送信號,通知在_waiter上等待的線程繼續(xù)執(zhí)行                  Monitor.Pulse(_locker);            }      }
     static void Work()      {            // 獲取鎖,確保線程安全            lock (_locker)            {                  // 如果_go標(biāo)志為false,則等待                  while (!_go)                  {                        Console.WriteLine("Worker is waiting...");
                       // 調(diào)用Wait釋放鎖并使線程等待,直到其他線程進(jìn)入相同鎖定對象并調(diào)用Pulse                        Monitor.Wait(_locker);                  }            }            // 當(dāng)線程被Pulse方法喚醒后,執(zhí)行以下代碼            Console.WriteLine("Worker is proceeding...");      }}


我們定義了一個簡單的線程同步示例。主線程創(chuàng)建并啟動了一個工作線程,然后等待用戶按下回車鍵。按下回車鍵后,主線程通過Monitor.Pulse()發(fā)送一個信號,這個信號會喚醒正在等待的工作線程。工作線程在被喚醒后繼續(xù)執(zhí)行,打印出"Worker is proceeding..."。

這個例子演示了如何使用Monitor.Wait()Monitor.Pulse()來同步線程的執(zhí)行。這種模式通常用于生產(chǎn)者-消費(fèi)者場景,其中一個線程正在等待另一個線程完成一些工作或提供數(shù)據(jù)。

結(jié)論

Thread.Sleep()Monitor.Wait()在多線程編程中扮演著不同的角色。Thread.Sleep()簡單地暫停線程,而Monitor.Wait()則用于更復(fù)雜的線程同步和通信。使用Thread.Sleep()時,線程簡單地等待一段時間,而使用Monitor.Wait()時,線程等待直到收到特定的通知。

在使用這些方法時,開發(fā)者應(yīng)該謹(jǐn)慎選擇適合他們應(yīng)用場景的方法。Thread.Sleep()在某些情況下可能會導(dǎo)致不必要的延遲,而Monitor.Wait()需要更多的控制和邏輯來確保線程安全地等待和恢復(fù)。正確地使用這些方法將有助于創(chuàng)建高效且響應(yīng)迅速的多線程應(yīng)用程序。


該文章在 2024/9/10 10:34:06 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊、財務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved