请参阅下面的示例,当我运行它时,它始终返回列表中第一个帐号(111111)的名称。 如果我评论''线程'部分一切正常。
static void Main(string[] args)
{
List<int> testdata = new List<int>();
testdata.Add(111111);
testdata.Add(222222);
testdata.Add(333333);
foreach (int data in testdata)
{
new Thread(delegate()
{
DataTable dt = DB.GetData(data);
if (dt.Count > 0)
{
Console.WriteLine("Name: {0}", dt.Rows[0]["Name"];);
}
// Signal the CountdownEvent.
countdownEvent.Signal();
}).Start();
}
// Wait for workers.
countdownEvent.Wait();
Console.WriteLine("Finished.");
}
当前输出:
Name: JULIE
Name: JULIE
Name: JULIE
注意:始终返回ID 111111的名称
预期产出:
Name: JULIE
Name: JOHN
Name: GRANT
答案 0 :(得分:6)
封闭。首先在线程中复制data
变量。现在的方式是,线程将在运行时以数据中的任何值运行 - 并且由于调用Start()和线程执行之间的延迟,可能所有三个都在最后一个数据上运行。
答案 1 :(得分:2)
将数据传递给您的委托arg,如下所示:
static void Main(string[] args)
{
List<int> testdata = new List<int>();
testdata.Add(111111);
testdata.Add(222222);
testdata.Add(333333);
foreach (int data in testdata)
{
new Thread(delegate(object arg)
{
DataTable dt = DB.GetData((int) arg);
if (dt.Count > 0)
{
Console.WriteLine("Name: {0}", dt.Rows[0]["Name"];);
}
// Signal the CountdownEvent.
countdownEvent.Signal();
}).Start(data);
}
// Wait for workers.
countdownEvent.Wait();
Console.WriteLine("Finished.");
}