1、通过实体类来传递(可以传递多个参数与获取返回值),demo如下:
需要在线程中调用的函数:
namespace ThreadParameterDemo { public class FunctionClass { public static string TestFunction(string name, int age) { //内部处理省略 return name + " 的年龄是:" + age; } } } |
通过实体来来封装:
namespace ThreadParameterDemo { /// /// 过渡类 /// public class TransitionalClass { private string name = string.Empty; private int age; public string acceptResults = string.Empty; public TransitionalClass(string name, int age) { this.name = name; this.age = age; } public void TestFunction() { acceptResults = FunctionClass.TestFunction(this.name, this.age); } } } |
调用:
private void Form1_Load(object sender, EventArgs e)
{
//实例化ThreadWithState类,为线程提供参数
TransitionalClass tc = new TransitionalClass(" Jack", 42);
// 创建执行任务的线程,并执行
Thread t = new Thread(new ThreadStart(tc.TestFunction));
t.Start();
//获取返回值,通过 tc.acceptResults;
}
小注:
必须注意IsBackground的问题,如果IsBackground为false的,则Windows程序在退出的时候,不会为你自动退出该线程。也就是实际上你的应用程序未结束。
MSDN推荐:多线程方法调用提供参数的最好办法是将目标方法包裹在类中,并为该类定义字段,这些字段将被用作新线程的参数。
这种方法的优点是,任何时候想要启动新线程,都可以创建类的新实例,该实例带有自身的参数。
BackgroundWorker 类
ThreadStart中的函数是没有返回值和参数的
2、异步调用中的参数和返回值
能完美解决参数和返回值的是使用异步调用的方式。异步调用和Thread相比,一个最大的劣势是不能控制其优先级。
具体代码如下:
public delegate string delegateFunction(string name,int age);//委托 delegateFunction df; private void Form1_Load(object sender, EventArgs e) { //指向需要调用的方法 df = new delegateFunction(FunctionClass.TestFunction); string name = "my name";//输入参数 int age = 19; IAsyncResult result = df.BeginInvoke(name,age, null, null); string myResult = df.EndInvoke(result);//用于接收返回值 MessageBox.Show(myResult); } |
简化:
public Func df;//委托 private void Form1_Load(object sender, EventArgs e) { //指向需要调用的方法 df += FunctionClass.TestFunction; string name = "my name";//输入参数 int age = 19; IAsyncResult result = df.BeginInvoke(name, age, null, null); string myResult = df.EndInvoke(result);//用于接收返回值 MessageBox.Show(myResult); } |
小注:
通过这种方式生成新线程是运行在后台的(background),优先级为normal