c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程
一、Thread:線程及與線程有關的類
????在 C#?語言中線程(Thread)是包含在進程中的,它位于 System.Threading 命名空間中。
????與線程有關的類同樣也都在 System.Threading 命名空間中,主要的類如下表所示。
| Thread | 在初始的應用程序中創建其他的線程 |
| ThreadState | 指定 Thread 的執行狀態,包括開始、運行、掛起等 |
| ThreadPriority | 線程在調度時的優先級枚舉值,包括 Highest、AboveNormal、Normal、BelowNormal、Lowest |
| ThreadPool | 提供一個線程池,用于執行任務、發送工作項、處理異步I/O等操作 |
| Monitor | 提供同步訪問對象的機制 |
| Mutex | 用于線程間同步的操作 |
| ThreadAbortException | 調用Thread類中的Abort方法時出現的異常 |
| ThreadStateException | Thead處于對方法調用無效的ThreadState時出現的異常 |
Thread 類主要用于實現線程的創建以及執行,其常用的屬性和方法如下表所示。
| Name | 屬性,獲取或設置線程的名稱 |
| Priority | 屬性,獲取或設置線程的優先級 |
| ThreadState | 屬性,獲取線程當前的狀態 |
| IsAlive? | 屬性,獲取當前線程是否處于啟動狀態 |
| IsBackground | 屬性,獲取或設置值,表示該線程是否為后臺線程 |
| CurrentThread | 屬性,獲取當前正在運行的線程 |
| Start()? | 方法,啟動線程 |
| Sleep(int millisecondsTimout) | 方法,將當前線程暫停指定的毫秒數 |
| Suspend() | 方法,掛起當前線程(已經被棄用) |
| Join() | 方法,阻塞調用線程,直到某個線程終止為止 |
| Interrupt() | 方法,中斷當前線程 |
| Resume() | 方法,繼續已經掛起的線程(已經被棄用) |
| Abort() | 方法,終止線程 |
二、ThreadStart:創建線程
????在?C#?語言中使用線程時首先需要創建線程,在使用 Thread 類的構造方法創建其實例時,需要用到 ThreadStart 委托或者 ParameterizedThreadStart 委托創建 Thread 類的實例
??? ThreadStart 委托只能用于無返回值、無參數的方法,ParameterizedThreadStart 委托則可以用于帶參數的方法。
????本節主要介紹使用 ThreadStart 委托創建 Thread 類的實例,關于 ParameterizedThreadStart 委托我們將在下一節《C# ParameterizedThreadStart》中為大家講解。
????使用 ThreadStart 創建線程首先需要創建 ThreadStart 委托的實例,然后再創建 Thread 類的實例。
????具體的代碼如下。
????????ThreadStart ts = new ThreadStart( 方法名 );????????Thread t = new Thread(ts);
??? 1.例:
????使用 ThreadStart 委托創建線程,并定義一個方法輸出 0?10 中所有的偶數。
????根據題目要求,創建控制臺應用程序,實現該程序的代碼如下。
? ? 總之我使用的是這個:
using System;using System.Diagnostics;using System.Threading;namespace ConsoleApp1{ class Program { static void Main(string[] args) { ThreadStart ts = new ThreadStart(PrintEven); Thread t = new Thread(ts); t.Start(); } private static void PrintEven() { for (int i = 0; i <= 10; i = i + 2) { Console.WriteLine(i); } } }}分析:
????首先是追加一個包,using System.Threading;
????然后先定義一個靜態方法,PrintEven()
????然后在Main()方法中運行。
????????總之首先是創建ThreadStart 委托實例,把自定義的方法委托進去。
????????再創建 Thread 類的實例。并通過Start()進行啟動線程。
運行結果:
????從上面的運行效果可以看出,使用 Threadstart 委托為 PrintEven 方法創建了線程,通過線程的 Start 方法啟動線程并調用了 PrintEven 方法。
????在一個應用程序中能同時啟動多個線程,下面通過實例演示啟動多個線程的效果。
????2.例
????在上一實例的基礎上添加一個打印 1?10 中的奇數的方法,再分別使用兩個 Thread 類的實例啟動打印奇數和偶數的方法。
using System;using System.Diagnostics;using System.Threading;namespace ConsoleApp1{ class Program { static void Main(string[] args) { ThreadStart ts1 = new ThreadStart(PrintEven); Thread t1 = new Thread(ts1); ThreadStart ts2 = new ThreadStart(PrintOdd); Thread t2 = new Thread(ts2); t1.Start(); t2.Start(); } private static void PrintEven() { for (int i = 0; i <= 10; i = i + 2) { Console.WriteLine(i); } } public static void PrintOdd() { for (int i = 1; i <= 10; i = i + 2) { Console.WriteLine(i); } } }}分析:
????其實就是進行兩次委托,并啟動進程。
????從上面的運行效果可以看出,兩個線程分別打印了 1?10 中的奇數和 0?10 中的偶數,但并不是按照線程的調用順序先打印出所有的偶數再打印奇數。
????需要注意的是,由于沒有對線程的執行順序和操作做控制,所以運行該程序每次打印的值的順序是不一樣的。
三、ParameterizedThreadStart:創建進程
????在 C#?語言中使用 ParameterizedThreadStart 創建進程,首先需要創建 ParameterizedThreadStart 委托的實例,然后再創建 Thread 類的實例。
????具體的代碼如下。
????????ParameterizedThreadStart pts=new ParameterizedThreadStart( 方法名 );????????Thread t=new Thread(pts);
????1.例
????創建一個方法輸出0?n的所有偶數,使用 ParameterizedThreadStart 委托調用該方法,并啟動打印偶數的線程。
using System;using System.Diagnostics;using System.Threading;namespace ConsoleApp1{ class Program { static void Main(string[] args) { ParameterizedThreadStart pts = new ParameterizedThreadStart(PrintEven); Thread t = new Thread(pts); t.Start(10); } //打印0~n中的偶數 private static void PrintEven(Object n) { for (int i = 0; i <= (int)n; i = i + 2) { Console.WriteLine(i); } } }}分析:
????首先是通過ParameterizedThreadStart 方式創建進程委托的實例。
????然后再創建 Thread 類的實例。
????最后啟動進程,并且提供參數。
????需要注意的是,在使用 ParameterizedThreadStart 委托調用帶參數的方法時,方法中的參數只能是 object 類型并且只能含有一個參數。
????在啟動線程時要在線程的 Start() 方法中為委托的方法傳遞參數。
????如果需要通過 ParameterizedThreadStart 委托引用多個參數的方法,由于委托方法中的參數是 object 類型的,傳遞多個參數可以通過類的實例來實現。
????下面通過實例來演示使用 ParameterizedThreadStart 委托引用多個參數的方法。
????2.例
????創建一個方法輸出指定范圍內數值的偶數,并創建線程調用該方法。
using System;using System.Diagnostics;using System.Threading;namespace ConsoleApp1{ class Program { static void Main(string[] args) { ParameterizedThreadStart pts = new ParameterizedThreadStart(PrintEven); ParameterTest pt = new ParameterTest(1, 10); Thread t = new Thread(pts); t.Start(pt); } private static void PrintEven(Object n) { //判斷n是否為ParameterTest 類的對象 if (n is ParameterTest) { int beginNum = ((ParameterTest)n).beginNum; int endNum = ((ParameterTest)n).endNum; for (int i = beginNum; i <= endNum; i++) { if (i % 2 == 0) { Console.WriteLine(i); } } } } } public class ParameterTest { public int beginNum; public int endNum; public ParameterTest(int a, int b) { this.beginNum = a; this.endNum = b; }????}}分析:
????這里先看34~43行的自定義構造類 ParameterTest。
????????也就是獲取兩個數,一個開始值,一個結束值。(也可以理解成最小值和最大值的區間。)
????然后是14~32行,自定義的鏡頭方法。
????????主要是進行判斷是否為ParameterTest 類的對象,以及以偶數進行輸出。
????最后是Main()方法里的內容。
????????先通過ParameterizedThreadStart 方式創建進程委托的實例。
????????????這里要主要參數。
????????然后是自定義類的實例。
????????????作為后期啟動進行時的參數。
????????然后將創建的委托實例,傳參進Thread類中。
????????????其實這樣,Thread類中就有了PrintEven方法中的功能。
????????最后在啟動進程時,傳入自定義實例的變量。
????運行該程序,在控制臺上將輸出 1?10 的偶數,即2、4、6、8、10。
????從代碼可以看出,通過為 ParameterTest 類中的字段賦值,并將其通過線程的 Start 方法傳遞給委托引用的方法 PrintEven,即可實現在委托引用的方法中傳遞多個參數的操作。
總結
以上是生活随笔為你收集整理的c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python判断两线段是否相交_c语言
- 下一篇: .net core webapi 列表返