https://www.cnblogs.com/weige/p/4240564.html
線程函數要麼沒有參數,要麼只能有一個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;
}
}
}