将参数传递给线程问题

时间:2010-10-27 13:07:53

标签: c# .net multithreading parameter-passing

在datagridview中,我有一个IP地址字段。 当我点击检查状态按钮时,我为datagridview中的每一行创建线程,然后在该IP上的主机上调用远程对象并获取一些信息,并将另一个datagridview字段设置为该信息。

但是有问题。在datagridview上错误地设置了信息。为什么呢?

    private void button_CheckStatus_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < dataGridView.Rows.Count; i++)
        {
            IPAddress IP;
            if (IsValidIP(dataGridView["IP", i].Value.ToString(), out IP))
            {
                Thread t = new Thread(() => CheckStatusThreadFunction(IP, i));
                t.Start();
            }
        }

    }

1 个答案:

答案 0 :(得分:2)

确保不捕获循环变量:

    for (int i = 0; i < dataGridView_VSD.Rows.Count; i++) 
    { 
        int ii = i;
        IPAddress IP; 
        if (IsValidIP(dataGridView_VSD["VSD_IP", i].Value.ToString(), out IP)) 
        { 
            Thread t = new Thread(() => CheckVSDStatusThreadFunction(IP, ii)); 
            t.Start(); 
        } 
    } 

这是一个非常常见的错误。

参见例如here