我正在尝试学习 .Net 中的线程。
你们中的许多人一定见过这个:
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(loop));
t.Start();
}
private void loop()
{
for (int i = 0; i < 100000; i++)
{
textBox1.Text = i.ToString();
}
}
它工作正常,但是如果我的循环方法中有参数怎么办,比如:
private void loop(string str)
{
for (int i = 0; i < 100000; i++)
{
textBox1.Text = i + str;
}
}
然后如何在我的 ThreadStart 中调用此方法,因为 ThreadStart 只接受方法名称。那么如何在不同的线程中调用loop方法呢?
最佳答案
Thread t = new Thread(new ParameterizedThreadStart(loop));
t.Start("Hello world");
private void loop(object obj)
{
string str = (string)obj;
for (int i = 0; i < 100000; i++)
{
// Don't do this: you can't change a control from another thread. Danger Will Robinson!
textBox1.Text = i + str;
}
}
请注意,loop
方法必须接受一个object
参数,因此您必须将object
向上转换为您的类型。如果你不想,你可以使用闭包和匿名方法:
string str = "Hello world";
Thread t = new Thread(() => {
for (int i = 0; i < 100000; i++)
{
// Don't do this: you can't change a control from another thread. Danger Will Robinson!
textBox1.Text = i + str;
}
});
t.Start();
通过这种方式,匿名方法将“关闭”str
并且它将类似,就好像您已经传递了参数一样。 相似 因为关闭变量存在差异/问题。实际上我会写类似这样的东西:
string str = "Hello world";
{
string str2 = str;
Thread t = new Thread(() => {
for (int i = 0; i < 100000; i++)
{
// Don't do this: you can't change a control from another thread. Danger Will Robinson!
textBox1.Text = i + str2;
}
});
t.Start();
}
这样就没有其他人可以“触摸”str2
。
如果你需要,我可以在 SO 上找到一些解释这个“问题”的答案
关于c# - ThreadStart with Parameter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7812748/