多線程(2)Thread

来源:http://www.cnblogs.com/mcgrady/archive/2017/06/20/7054565.html
-Advertisement-
Play Games

我們先從最基礎的Thread說起。 創建並啟動線程 創建並啟動一個線程,如下代碼: 1 namespace ConsoleApplication17 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 var thread ...


  我們先從最基礎的Thread說起。

 

創建並啟動線程

創建並啟動一個線程,如下代碼:

 1 namespace ConsoleApplication17
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             var thread = new Thread(PrintNumbers);
 8             thread.Start();
 9 
10             Console.WriteLine("Thread Start...");
11             Console.ReadKey();
12         }
13 
14         /// <summary>
15         /// 匹配委托的方法
16         /// </summary>
17         public static void PrintNumbers()
18         {
19             Console.WriteLine("Starting......");
20             for (int i = 0; i < 10; i++)
21             {
22                 Console.WriteLine(i);
23             }
24         }
25     }
26 }
View Code

 

運行結果:

 

暫停線程

假如需要暫停當前線程,可以調用Thread.Sleep方法,使當前線程處於阻塞狀態,如下代碼:

 1 namespace ConsoleApplication17
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             var thread = new Thread(PrintNumbersWithDelay);
 8             thread.Start();
 9 
10             Console.WriteLine("Thread Start...");
11             Console.ReadKey();
12         }
13 
14         /// <summary>
15         /// 
16         /// </summary>
17         public static void PrintNumbersWithDelay()
18         {
19             Console.WriteLine("Starting......");
20             for (int i = 0; i < 10; i++)
21             {
22                 Thread.Sleep(TimeSpan.FromMilliseconds(1000));
23                 Console.WriteLine(string.Format("{0}  {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), i));
24             }
25         }
26     }
27 }
View Code

 

輸出結果:

合併線程

如果需要等待某個子線程執行行,主線程才繼續執行時,可以使用Thread.Join方法來實現,如下代碼:

 1 namespace ConsoleApplication17
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             //Thread
 8             var thread = new Thread(PrintNumbersWithDelay);
 9             thread.Start();
10             thread.Join();
11 
12             Console.WriteLine("Thread Completed!");
13             Console.ReadKey();
14         }
15 
16         /// <summary>
17         /// 
18         /// </summary>
19         public static void PrintNumbersWithDelay()
20         {
21             Console.WriteLine("Starting......");
22             for (int i = 0; i < 10; i++)
23             {
24                 Thread.Sleep(TimeSpan.FromMilliseconds(1000));//線程阻塞1s,此時線程狀態為WaitSleepJoin
25                 Console.WriteLine(string.Format("當前時間:{0},線程狀態:{1},結果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),Thread.CurrentThread.ThreadState, i));
26             }
27         }
28     }
29 }
View Code

 輸出結果:

終止線程

 如果在子線程運行過程中強制終止它,可以調用Thread.Abort方法,這會給當前子線程觸發ThreadAbortException異常,導致線程被終止!

如下代碼:

 1 namespace ConsoleApplication17
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Console.WriteLine("Starting Program...");
 8             var thread = new Thread(PrintNumbersWithDelay);
 9             thread.Start();
10 
11             Thread.Sleep(TimeSpan.FromMilliseconds(6000));
12             thread.Abort();
13 
14             Console.WriteLine("Thread has been abort!");
15             Console.ReadKey();
16         }
17 
18         /// <summary>
19         /// 
20         /// </summary>
21         public static void PrintNumbersWithDelay()
22         {
23             Console.WriteLine("Starting......");
24             for (int i = 0; i < 10; i++)
25             {
26                 Thread.Sleep(TimeSpan.FromMilliseconds(1000));
27                 Console.WriteLine(string.Format("當前時間:{0},線程狀態:{1},結果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ThreadState, i));
28             }
29         }
30     }
31 }
View Code

線程傳遞參數

通過分析可以發現,Thread接受的實際上是一個委托,包括無參數的委托和接受一個Object類型的委托,

 

如下代碼:

 1 namespace ConsoleApplication17
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Console.WriteLine("Main thread starting...");
 8             var thread = new Thread(PrintNumbersWithCount);
 9             thread.Start(5);
10             thread.Join();
11 
12             Console.WriteLine("Main thread completed!");
13             Console.ReadKey();
14         }
15 
16         /// <summary>
17         /// 匹配委托方法,帶參數
18         /// </summary>
19         public static void PrintNumbersWithCount(object obj)
20         {
21             Console.WriteLine("Sub thread starting...");
22             var number = Convert.ToInt32(obj);
23             for (int i = 0; i < number; i++)
24             {
25                 Console.WriteLine(string.Format("當前時間:{0},線程狀態:{1},結果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ThreadState, i));
26             }
27         }
28     }
29 }
View Code

 

輸出結果:

 


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

-Advertisement-
Play Games
更多相關文章
  • awk [-field-separator] 'commands' input-file(s) ...
  • 在.Net框架中,如果您查看所有類型的的基類:System.Object類,將找到如下4個與相等判斷的方法: static Equals() virtual Equals() static ReferenceEquals() virtual GetHashCode() 除此之外,Microsoft已 ...
  • 配置的本質就是字元串的鍵值對,但是對於面向對象語言來說,能使用強類型的配置是何等的爽哉! 目錄 1. ASP.NET Core 配置系統 2. 強類型的 Options 3. Configure 方法 4. 源碼解析 ASP.NET Core 配置系統 在ASP.NET 4.X中,通常將配置存儲在 ...
  • C#編寫簡易的學生成績查詢 什麼是學生成績查詢系統? 使用C#語言編寫的一個可安裝的簡單CS系統,實現了用戶登錄,學生信息添加,成績修改,刪除,查詢等功能 開發環境 開發環境 visual studio2010(新版本2015,2017也可) visual studio2010(sql2008資料庫 ...
  • 背景:C# .Net MVC ,以及已經開發了近1年半的我,做了好久但是對於這個技術沒有總結,這是一個機會,寫寫我理解的東西吧。--以下內容參考了別人的文章 技術介紹: LINQ(Language Integrated Query,語言集成查詢)是一組用於C#和VB.NET語言的擴展,它允許編寫C# ...
  • 使用Thread類已經可以創建並啟動線程了,但是隨著開啟的線程越來越多,線程的創建和終止都需要手動操作,非常繁瑣,另一個問題是,開啟更多新的線程但是沒有用的線程沒有及時得到終止的時候,會占用越來越多的系統資源,影響性能。 所以,.net為我們引入了ThreadPool(線程池),我們只需要把要執行的 ...
  • 相關文章: "ASP.NET Core 使用 Hangfire 定時任務" ASP.NET Core Hangfire 在正式環境發佈之後,如果訪問 http://10.1.2.31:5000/hangfire/ 的話,會報 未授權錯誤,原因是 Hangfire 預設增加了授權配置。 解決方式: 增 ...
  • DotNetBar的視窗樣式丟失 C# 調用DotNetBar很方便,將DevComponents.DotNetBar2.dll和DevComponents.DotNetBar.Design.dll放在工程的Debug目錄下(下載地址)。將DevComponents.DotNetBar2.dll 直 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...