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