将参数传递给线程

时间:2013-08-11 14:01:50

标签: c# multithreading parameter-passing

我在使用线程时遇到问题。有这样一个类:

public class MyThread
{
    public void Thread1(int a)
    {
        for (int i = 0; i < 1000000; i++)
        {
            j++;
            for (int i1 = 0; i1 < 1000; i1++)
            {
                j++;
            }
        }
        MessageBox.Show("Done From Class");
    }
}

我使用下面的代码来使用它:

private void button1_Click(object sender, EventArgs e)
{
    MyThread thr = new MyThread();
    Thread tid1 = new Thread(new ThreadStart(thr.Thread1));

    tid1.Start();
    MessageBox.Show("Done");
}

由于Thread1参数(int a),我收到错误, 没有任何参数时没有任何问题。 我该如何解决?

2 个答案:

答案 0 :(得分:0)

首选方法是第一种方法,因为您可以将多个参数传递给方法,而无需始终转换为对象。

Thread t= new Thread(() => thr.Thread1(yourparameter));
t.Start();

或者,您需要在将参数传递给线程时使用parameterised线程。你也可以做

Thread t = new Thread (new ParameterizedThreadStart(thr.Thread1));
t.Start (yourparameter);

当然,你的参数必须是第二个例子的对象类型。

答案 1 :(得分:0)

线程接受一个object参数:

public void Thread1(object a1)
{
    int a = (int)a1;
    ...
}

像这样传递:

Thread t = new Thread(Thread1);
t.Start(100);

您通常不需要构建委托。从{C#2.0开始执行new ThreadStart(...)通常是无用的。

另一个(常见的)解决方案是将Thread1放在另一个对象中:

public class MyThread
{
    public int A;

    public void Thread1()
    {
        // you can use this.A from here
    }
}

var myt = new MyThread();
myt.A = 100;
var t = new Thread(myt.Thread1)
t.Start();

这是因为委托具有对该方法的包含对象的引用。显然,这样你就无法访问调用者的对象......但是你可以这样做:

public class MyThread
{
    public int A;
    public CallerType ParentThis;

    public void Thread1()
    {
        // you can use this.A from here
        // You can use ParentThis.Something to access the caller
    }
}

var myt = new MyThread();
myt.A = 100;
myt.ParentThis = this;
var t = new Thread(myt.Thread1)
t.Start();

最后一种常用方法是使用Ehsan Ullah建议的闭包(带() =>的示例)