0

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

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 Parameter (int a) 我得到错误,当我没有任何参数时没有任何问题。我该如何解决?

4

2 回答 2

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(带有 的示例() =>)所建议的那样

于 2013-08-11T14:21:37.017 回答
0

首选方法是第一个方法,因为您可以将多个参数传递给您的方法,而不必一直转换为对象。

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

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

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

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

于 2013-08-11T14:05:49.617 回答