【问题标题】:Pass Parameter to thread problem将参数传递给线程问题
【发布时间】:2010-10-27 13:07:53
【问题描述】:

在 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();
            }
        }

    }

【问题讨论】:

  • 怎么设置错了?您期望的结果是什么?实际结果与预期结果有何不同?
  • get info 中的文本应该设置在第 i 行的前面,但有时会设置在下面的下一行或第二行。

标签: c# .net multithreading parameter-passing


【解决方案1】:

确保不要捕获循环变量:

    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

【讨论】:

  • @HPT:添加了我的答案的链接。
  • @HPT,请参阅this article 以获得解释。您所有的匿名代表都在捕获相同的变量i,因此它对所有代表都具有相同的值。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2015-03-08
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
相关资源
最近更新 更多