轉:VB中的API詳解

来源:https://www.cnblogs.com/littlepumpkin/archive/2018/06/02/9125698.html
-Advertisement-
Play Games

在接下來的這篇文章中,我將向大家介紹.NET中的線程API,怎麼樣用C#創建線程,啟動和停止線程,設置優先順序和狀態.在.NET中編寫的程式將被自動的分配一個線程.讓我們來看看用C#編程語言創建線程並且繼續學習線程的知識。我們都知道.NET的運行時環境的主線程由Main ()方法來啟動應用程式,而且. ...


在接下來的這篇文章中,我將向大家介紹.NET中的線程API,怎麼樣用C#創建線程,啟動和停止線程,設置優先順序和狀態.

在.NET中編寫的程式將被自動的分配一個線程.讓我們來看看用C#編程語言創建線程並且繼續學習線程的知識。我們都知道.NET的運行時環境的主線程由Main ()方法來啟動應用程式,而且.NET的編譯語言有自動的垃圾收集功能,這個垃圾收集發生在另外一個線程裡面,所有的這些都是後臺發生的,讓我們無法感覺到發生了什麼事情.在這裡預設的是只有一個線程來完成所有的程式任務,但是正如我們在第一篇文章討論過的一樣,有可能我們根據需要自己添加更多的線程讓程式更好的協調工作。比如說我們的例子中,一個有用戶輸入的同時需要繪製圖形或者完成大量的運算的程式,我們必須得增加一個線程,讓用戶的輸入能夠得到及時的響應,因為輸入對時間和響應的要求是緊迫的,而另外一個線程負責圖形繪製或者大量的運算。

.NET 基礎類庫的System.Threading命名空間提供了大量的類和介面支持多線程。這個命名空間有很多的類,我們將在這裡著重討論Thread這個類。

System.Threading.Thread類是創建並控制線程,設置其優先順序並獲取其狀態最為常用的類。他有很多的方法,在這裡我們將就比較常用和重要的方法做一下介紹:

Thread.Start():啟動線程的執行;

Thread.Suspend():掛起線程,或者如果線程已掛起,則不起作用;

Thread.Resume():繼續已掛起的線程;

Thread.Interrupt():中止處於 Wait或者Sleep或者Join 線程狀態的線程;

Thread.Join():阻塞調用線程,直到某個線程終止時為止

Thread.Sleep():將當前線程阻塞指定的毫秒數;

Thread.Abort():以開始終止此線程的過程。如果線程已經在終止,則不能通過Thread.Start()來啟動線程。

通過調用Thread.Sleep,Thread.Suspend或者Thread.Join可以暫停/阻塞線程。調用Sleep()和Suspend()方法意味著線程將不再得到CPU時間。這兩種暫停線程的方法是有區別的,Sleep()使得線程立即停止執行,但是在調用Suspend()方法之前,公共語言運行時必須到達一個安全點。一個線程不能對另外一個線程調用Sleep()方法,但是可以調用Suspend()方法使得另外一個線程暫停執行。對已經掛起的線程調用Thread.Resume()方法會使其繼續執行。不管使用多少次Suspend()方法來阻塞一個線程,只需一次調用Resume()方法就可以使得線程繼續執行。已經終止的和還沒有開始執行的線程都不能使用掛起。Thread.Sleep(int x)使線程阻塞x毫秒。只有當該線程是被其他的線程通過調用Thread.Interrupt()或者Thread.Abort()方法,才能被喚醒。如果對處於阻塞狀態的線程調用Thread.Interrupt()方法將使線程狀態改變,但是會拋出ThreadInterupptedException異常,你可以捕獲這個異常並且做出處理,也可以忽略這個異常而讓運行時終止線程。在一定的等待時間之內,Thread.Interrupt()和Thread.Abort()都可以立即喚醒一個線程。

下麵我們將說明如何從一個線程中止另外一個線程。在這種情況下,我們可以通過使用Thread.Abort()方法來永久銷毀一個線程,而且將拋出ThreadAbortException異常。使終結的線程可以捕獲到異常但是很難控制恢復,僅有的辦法是調用Thread.ResetAbort()來取消剛纔的調用,而且只有當這個異常是由於被調用線程引起的異常。因此,A線程可以正確的使用Thread.Abort()方法作用於B線程,但是B線程卻不能調用Thread.ResetAbort()來取消Thread.Abort()操作。Thread.Abort()方法使得系統悄悄的銷毀了線程而且不通知用戶。一旦實施Thread.Abort()操作,該線程不能被重新啟動。調用了這個方法並不是意味著線程立即銷毀,因此為了確定線程是否被銷毀,我們可以調用Thread.Join()來確定其銷毀,Thread.Join()是一個阻塞調用,直到線程的確是終止了才返回。但是有可能一個線程調用Thread.Interrupt()方法來中止另外一個線程,而這個線程正在等待Thread.Join()調用的返回。

儘可能的不要用Suspend()方法來掛起阻塞線程,因為這樣很容易造成死鎖。假設你掛起了一個線程,而這個線程的資源是其他線程所需要的,會發生什麼後果。因此,我們儘可能的給重要性不同的線程以不同的優先順序,用Thread.Priority()方法來代替使用Thread.Suspend()方法。

Thread類有很多的屬性,這些重要的屬性是我們多線程編程必須得掌握的。

Thread.IsAlive屬性:獲取一個值,該值指示當前線程的執行狀態。如果此線程已啟動並且尚未正常終止或中止,則為 true;否則為 false。

Thread.Name 屬性:獲取或設置線程的名稱。

Thread.Priority 屬性:獲取或設置一個值,該值指示線程的調度優先順序。
Thread.ThreadState 屬性:獲取一個值,該值包含當前線程的狀態。
在下麵的例子中,我們將看看怎麼設置這些屬性,在隨後的例子中我們將詳細的討論這些屬性。
創建一個線程,首先得實例化一個Thread類,在類得構造函數中調用ThreadStart委派。這個委派包含了線程從哪裡開始執行。當線程啟動後,Start()方法啟動一個新的線程。下麵是例子程式。
using System;
using System.Threading ;
namespace LearnThreads
{

class Thread_App
{
public static void First_Thread()
{
Console.WriteLine("First thread created");
Thread current_thread = Thread.CurrentThread;
string thread_details = "Thread Name: " + current_thread.Name +
"/r/nThread State: " + current_thread.ThreadState.ToString()+
"/r/n Thread Priority level:"+current_thread.Priority.ToString();
Console.WriteLine("The details of the thread are :"+ thread_details);
Console.WriteLine ("first thread terminated");
}
public static void Main()
{
ThreadStart thr_start_func = new ThreadStart (First_Thread);
Console.WriteLine ("Creating the first thread ");
Thread fThread = new Thread (thr_start_func);
fThread.Name = "first_thread";
fThread.Start (); //starting the thread
}
}
}
在這個例子中,創建了一個fThread的線程對象,這個線程負責執行First_Thread()方法裡面的任務。當Thread的Start() 方法被調用時包含First_Thread()的地址ThreadStart的代理將被執行。
Thread狀態
System.Threading.Thread.ThreadState屬性定義了執行時線程的狀態。線程從創建到線程終止,它一定處於其中某一個狀態。當線程被創建時,它處在Unstarted狀態,Thread類的Start() 方法將使線程狀態變為Running狀態,線程將一直處於這樣的狀態,除非我們調用了相應的方法使其掛起、阻塞、銷毀或者自然終止。如果線程被掛起,它將處於Suspended狀態,除非我們調用resume()方法使其重新執行,這時候線程將重新變為Running狀態。一旦線程被銷毀或者終止,線程處於Stopped狀態。處於這個狀態的線程將不復存在,正如線程開始啟動,線程將不可能回到Unstarted狀態。線程還有一個Background狀態,它表明線程運行在前臺還是後臺。在一個確定的時間,線程可能處於多個狀態。據例子來說,一個線程被調用了Sleep而處於阻塞,而接著另外一個線程調用Abort方法於這個阻塞的線程,這時候線程將同時處於WaitSleepJoin和AbortRequested狀態。一旦線程響應轉為Sle阻塞或者中止,當銷毀時會拋出ThreadAbortException異常。
線程優先順序
System.Threading.Thread.Priority枚舉了線程的優先順序別,從而決定了線程能夠得到多少CPU時間。高優先順序的線程通常會比一般優先順序的線程得到更多的CPU時間,如果不止一個高優先順序的線程,操作系統將在這些線程之間迴圈分配CPU時間。低優先順序的線程得到的CPU時間相對較少,當這裡沒有高優先順序的線程,操作系統將挑選下一個低優先順序 的線程執行。一旦低優先順序的線程在執行時遇到了高優先順序的線程,它將讓出CPU給高優先順序的線程。新創建的線程優先順序為一般優先順序,我們可以設置線程的優先順序別的值,如下麵所示:
Highest
AboveNormal
Normal
BelowNormal
Lowest
結論:在這一部分,我們討論了線程的創建何線程的優先順序。System.Threading命名空間還包含了線程鎖定、線程同步何通訊、多線程管理類以及死鎖解決等等高級特性,在後面的部分我們將繼續討論這些內容。


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

-Advertisement-
Play Games
更多相關文章
  • 通過上篇文章,大家已經能夠清楚的瞭解到treeMap插入結點的過程,那麼本篇文章就來分析下TreeMap刪除一個結點時,內部數據結構發生了怎樣的變化。 TreeMap刪除某個結點的源碼分析 1 /** 2 * 刪除節點,並平衡紅黑樹的操作 3 * 4 * @Param Entry<K,V> p 要刪 ...
  • 要求: 1、創建三個游戲人物,分別是: 蒼井井,女,18,初始戰鬥力1000 東尼木木,男,20,初始戰鬥力1800 波多多,女,19,初始戰鬥力2500 2、游戲場景,分別: 草叢戰鬥,消耗200戰鬥力 自我修煉,增長100戰鬥力 多人游戲,消耗500戰鬥力 ...
  • 在生活中我們時常會遇到同步的問題,而且大多數的實際問題都是線程的同步問題 我這裡以生活中的火車售票來進行舉例: 假設現在我們總共有1000張票要進行出售,共有10個出售點,那麼當售票到最後只有一張票時,每個售票點如何去處理這唯一的一張票?或者對於某一張票而言,假設它正在售票站1售票的程式執行過程中, ...
  • Java的迴圈跳轉語句一:Java迴圈跳轉語句之 break;二:Java迴圈跳轉語句之 continue; ...
  • 首先要談的是,今天的話題所聊的程式員包含哪些人? 在中國,寫程式,不僅僅是一種興趣,更多的時候,還是一種普通職業和謀生工具 大公司有厲害的程式員,優秀的架構師,但大量的小公司也有很多普通的程式員。在我這些年的工作經歷中,也越來越深刻的感受到普通程式員的影響和力量。對於高階程式員,所謂八仙過海各有神通 ...
  • 內容轉自網路(具體轉載哪裡忘記了,有知道的) 前言 代碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於代碼的運行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海裡面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被喂飽了。代碼優化也是 ...
  • 以下是 基類 Form1 // 委托、事件是 public 和全局的 public delegate void ButtonClickdHandle(object sender, EventArgs e);//定義委托 public event ButtonClickdHandle UserCont ...
  • 轉發請註明出處:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 實在沒有找到Unity容器的AOP應用程式示例的說明,在微軟官網找到了教程(https://docs.microsoft.com/zh-cn/previous-versions ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...