多线程-参数传递

来源:互联网 发布:c语言学生信息管理系统 编辑:程序博客网 时间:2024/05/16 14:27

传递参数给线程的方法通常有两种方法:

 

一、利用多线程-创建线程一节中提到的ParameterizedThreadStart委托,它可以接收单个Object参数

public delegate void ParameterizedThreadStart (object obj);

例如:

class ThreadTest {      static void Main()     {            Thread t = new Thread (Go);            t.Start (true);    }     static void Go (object upperCase)     {            bool upper = (bool) upperCase;            Console.WriteLine (upper ? "HELLO!" : "hello!");      }}

在整个例子中,编译器自动推断出ParameterizedThreadStart委托,因为Go方法接收一个单独的object参数,就像这样写:

Thread t = new Thread (new ParameterizedThreadStart (Go));t.Start (true);

ParameterizedThreadStart的特性是在使用之前我们必需对我们想要的类型(这里是bool)进行装箱操作,并且它只能接收一个参数。

一个替代方案是使用一个ThreadStart形式的匿名方法调用一个普通的有参方法,代码如下:

public class ThreadTest{    static void Main()    {        Thread t = new Thread(delegate() { WriteText("Hello"); });        t.Start();    }    static void WriteText(string text)    {        Console.WriteLine(text);    }}

优点是目标方法(这里是WriteText),可以接收任意数量的参数,并且没有装箱操作。

 

注意: 使用 ParameterizedThreadStart 委托不是传递数据的类型安全的方法,因为 System.Threading.Thread.Start(System.Object) 方法重载接受任何对象。一种替代方法是将线程过程和数据封装在帮助器类中,并使用 ThreadStart 委托执行线程过程。

 

二、利用线程辅助类+非静态入口方法

//线程辅助类public class DoWork{    private int a;    private string b;    public DoWork(int a, string b)    {        this.a = a;        this.b = b;    }    //非静态入口方法    public void TProc()    {        Trace.WriteLine("线程启动 " + a.ToString() + " " + b);    }}public partial class Form1 : Form{    public Form1()    {        InitializeComponent();    }    private void btnCreateThread_Click(object sender, EventArgs e)    {        DoWork w = new DoWork(3, "abc");        //传入对象实例的方法        Thread t = new Thread(new ThreadStart(w.TProc));        t.Start();    }}