線程函數要么沒有參數,要么只能有一個object參數,而且均沒有返回值,這樣就大大降低了程序的靈活性,其實我們想要的是能像普通方法一樣正常使用參數和返回值!能不能實現這個需求呢?下面就介紹兩種方法
一、添加外殼方法
原理:把參數傳遞變成了對變量的調用
方法:定義一個專門的線程類。
1、需要向線程傳遞的參數和返回值作為類的公共屬性;
2、線程函數的真正方法也放在該類里邊
3、加殼的線程函數也放在里邊(真正調用的是2的方法)
public class MyThread { public double X= 10; public double Y= 0;
public double Result; public MyThread(int x,int y) { this.X= X;
this.Y= y;
}
//真正方法 public double SomeFunc(double x,double y)
{
//加法運算等
}
//加殼方法 public void Calculate() { Result = SomeFunc(X,Y);
} } MyThread t=new MyThread(){X=1,Y=2}; ThreadStart threadStart=new ThreadStart(t.Calculate) Thread thread=new Thread(threadStart); thread.Start();
thread.Join();
Console.WriteLine(t.Result);
}
二、設計一個輸入輸出輔助類
既然ParameterizedThreadStart委托類型的線程函數可以輸入一個object類型的參數,那么我們就從這個類型的參數入手:將線程函數的“輸入參數”和“返回值”封裝在一個類里邊,這個類的實例就作為這個唯一的object參數,上代碼一切就明白了!
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { MyThread obj = new MyThread(); ThreadMethodHelper argu = new ThreadMethodHelper(); argu.x = 5; argu.y = 10; Thread t = new Thread(obj.SomeFunc); t.Start(argu); t.Join(); Console.WriteLine(argu.returnValue); Console.Read(); } } class ThreadMethodHelper { //方法參數 public int x; public int y; //方法返回值 public long returnValue; } class MyThread { public void SomeFunc(object argu) { long result = 0; int x = (argu as ThreadMethodHelper).x; int y = (argu as ThreadMethodHelper).y; result = x + y; (argu as ThreadMethodHelper).returnValue = result; } } }