C#多线程样本为不同的帐户返回相同的输出

时间:2014-05-20 14:42:16

标签: c# multithreading

请参阅下面的示例,当我运行它时,它始终返回列表中第一个帐号(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

2 个答案:

答案 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."); 
}