.NET非同步程式設計——給執行緒傳遞資料

shanzm發表於2021-08-24

shanzm-2021年8月24日 19:51:26

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();
}


4. 參考以及文中原始碼下載

相關文章