【发布时间】:2009-09-14 20:17:36
【问题描述】:
我今天刚开始玩线程,遇到了一些我不明白的东西。
public void Main()
{
int maxValue = 5;
for (int ID = 0; ID < maxValue; ID++)
{
temp(ID);
}
}
public void temp(int i)
{
MessageBox.Show(i.ToString());
}
尽可能基本的工作正常,但是当我尝试为每个线程创建一个新线程时,它只传递了 maxValue。请忽略这样做有多糟糕,我只是把它写成一个简单的例子。
public void Main()
{
int maxValue = 5;
for (int ID = 0; ID < maxValue; ID++)
{
threads.Add(new Thread(() => temp(myString, rowID)));
threads[rowID].Start();
}
}
public void temp(string myString, int i)
{
string _myString = myString;
MessageBox.Show(i.ToString());
}
鉴于此,我有两个问题: 1) 为什么没有在传递 ID 的新线程上调用该方法? 2) 这应该如何正确编码?
【问题讨论】:
-
首先,您有未声明的 rowID 变量。将这两个事件重命名为 ID,它将正常工作。以下答案已过时!
-
rowID 是一个错字。如果将其更改为 ID 则不起作用 Jons 的答案是正确的。
-
@mnn:不会。您对捕获的变量在 C# 中的工作方式有多熟悉?
-
Jon Skeet:AFAIK 值类型与匿名委托一样保存,所以没问题。
标签: c# multithreading loops