.NET非同步程式設計——給執行緒傳遞數據
0. 前情說明
首先我們都知道,創建一個執行緒執行一個無參函數,則方式如下:
//期望在執行緒中執行的函數
static void Do()
{
Console.WriteLine("Create Thread");
}
//創建執行緒執行函數
static void Main(string[] ars)
{
Thread thread=new Thread(Do);
thread.Start();
Console.ReadKey();
}
1. ParameterizedThreadStart類型的委託
使用以ParameterizedThreadStart
類型的委託為參數的Thread對象構造函數,並使用Thread.Start()來傳遞參數
這裡首先說明一下,上文中示例,創建Thread對象,使用的構造函數的參數是ThreadStart
類型的委託
而Thread()方法在.net中有四個重載,我們可以使用其參數類型為ParameterizedThreadStart
類型的構造函數,實現執行緒中執行帶參數的函數,即往執行緒中傳遞數據。
注意:
-
是使用
Thread.Start(object param)
傳遞參數的 -
ParameterizedThreadStart
類型的委託是:參數類型是object類型,無返回值的 -
因為
ParameterizedThreadStart
類型的委託的參數類型是object類型,所以我們需要修改期望在新執行緒中行的方法,將其參數改為object類型,在方法中使用時在進行拆箱
示例:
static void Do(object obj)
{
int n = (int)obj;
Console.WriteLine($"方法1:新開執行緒執行方法,其參數是{n}");
}
static void Main(string[] args)
{
Thread thread = new Thread(Do);//這裡的Do函數就是ParameterizedThreadStart類型的委託
int n = 999;
thread.Start(n);//在Start函數中傳遞參數
}
2. 使用自定義類
將方法封裝在類中,則在自定義類實例化的時候,實現傳遞參數
這裡我們依舊是使用Thread對象的參數類型為ThreadStart類型的構造函數,但是我們需要在新執行緒中執行的有參函數封裝在一個類中
在類的實例化時,實現傳遞參數
示例:
有一個期望在新執行緒中執行的有參函數如下
pubic void Do(string param)
{
Console.WriteLine($"新開執行緒執行方法,其參數是{param}");
}
我們可以這樣封裝該方法,並在創建執行緒並執行該方法
public class MyClass
{
public int param { get; set; }
public MyClass(int n)
{
this.param = n;
}
public void Do()
{
Console.WriteLine($"方法2:新開執行緒執行方法,其參數是{param}");
}
}
static void Main(string[] args)
{
MyClass myClass=new MyClass(999);
Thread thread =new Thread(myClass.Do);
}
3. 使用Lambda表達式
使用Lambda表達式調用期望在新執行緒中執行的函數
示例:
//期望在新執行緒中執行的方法
static void Do(int n, int m)
{
Console.WriteLine(n * m);
}
static void Main(string[] args)
{
Thread thread1 = new Thread(() => Do(2, 3));//定義一個Lambda表達式,調用Do()函數
thread1.Start();
//其實這裡我們就是可以將所有的函數邏輯直接寫在Lambda表達式中,從而更加方便
Thread thread2 = new Thread(() => { Console.WriteLine(2 * 3); });
thread2.Start();
}