天天看點

在C#中主線程和子線程如何實作互相傳遞資料

在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”