我在使用线程时遇到问题。有这样一个类:
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),我收到错误, 没有任何参数时没有任何问题。 我该如何解决?
答案 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
建议的闭包(带() =>
的示例)