在C#中主線程和子線程如何實作互相傳遞資料
老帥
在C#中建立線程Thread時,可以有多種方法,而主線程和子線程之間又如何實作互相傳遞資料,每種建立方法傳遞參數的效果是不同的,逐一看一下:
一、不帶參數建立Thread
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code>using</code> <code>System; </code>
<code>using</code> <code>System.Collections.Generic; </code>
<code>using</code> <code>System.Text; </code>
<code>using</code> <code>System.Threading; </code>
<code>namespace</code> <code>ATest </code>
<code>{ </code>
<code> </code><code>class</code> <code>A </code>
<code> </code><code>{ </code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>Main() </code>
<code> </code><code>{ </code>
<code> </code><code>Thread t = </code><code>new</code> <code>Thread(</code><code>new</code> <code>ThreadStart(A)); </code>
<code> </code><code>t.Start(); </code>
<code> </code><code>Console.Read(); </code>
<code> </code><code>} </code>
<code> </code><code>private</code> <code>static</code> <code>void</code> <code>A() </code>
<code> </code><code>{ </code>
<code> </code><code>Console.WriteLine(</code><code>"不帶參數 A!"</code><code>); </code>
<code> </code><code>} </code>
<code>}</code>
結果顯示“不帶參數 A!”
二、帶一個參數建立Thread
由于ParameterizedThreadStart要求參數類型必須為object,是以定義的方法B形參類型必須為object。
24
<code>namespace</code> <code>BTest </code>
<code> </code><code>class</code> <code>B</code>
<code> </code><code>{ </code>
<code> </code><code>Thread t = </code><code>new</code> <code>Thread(</code><code>new</code> <code>ParameterizedThreadStart(B)); </code>
<code> </code><code>t.Start(</code><code>"B"</code><code>); </code>
<code> </code><code>private</code> <code>static</code> <code>void</code> <code>B(</code><code>object</code> <code>obj) </code>
<code> </code><code>Console.WriteLine(</code><code>"帶一個參數 {0}!"</code><code>,obj.ToString ()); </code>
結果顯示“帶一個參數 B!”
三、帶多個參數建立Thread
由于Thread預設隻提供了這兩種構造函數,如果需要傳遞多個參數,可以基于第二種方法,将參數作為類的屬性傳給線程。
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace CTest
{
class C
{
public static void Main()
{
MyParam m = new MyParam();
m.x = 6;
m.y = 9;
Thread t = new Thread(new ThreadStart(m.Test));
t.Start();
Console.Read();
}
}
class MyParam
public int x, y;
public void Test()
Console.WriteLine("x={0},y={1}", this.x, this.y);
}
}
}
結果顯示“x=6,y=9”
四、利用回調函數給主線程傳遞參數
我們可以基于方法三,将回調函數作為類的一個方法傳進線程,友善線程回調使用。
m.callBack = ThreadCallBack;
private void ThreadCallBack(string msg)
{
Console.WriteLine("CallBack:" + msg);
}
private delegate void ThreadCallBackDelegate(string msg);
public ThreadCallBackDelegate callBack;
callBack("x=6,y=9");
結果顯示“CallBack:x=6,y=9”