0

只是尝试学习Invoke/BeginInvoke,我遇到了那个问题。

       // Update UI
       public void UpdateForm(string value) {
        txtLog.AppendText(value + "\r\n");
       }


       // Thread function
       private void readSocket() {
        string row = "";

        while (socket.Connected) {                
            row = socket.readLine();            

            if (IsControlValid(this))
                BeginInvoke((MethodInvoker)delegate { UpdateForm(String.Copy(row)); });                    

        }
    }

使用Invoke方法我的 UI 更新为正确的文本,而不是如果我使用BegineInvoke我看到错误的文本,即一些文本重复了很多时间。我知道那个电话

BeginInvoke((MethodInvoker)delegate { UpdateForm(row); });  

也许“行”可以是共享变量的行为,而不是

BeginInvoke((MethodInvoker)delegate { UpdateForm(String.Copy(row)); });                    

我认为每个 BeginInvoke 调用都会创建一个“新”委托,因此使用 String.Copy 必须创建另一个字符串实例,但我总是看到错误的值(重复,ecc)。

我哪里错了?

4

1 回答 1

6

也许“行”可以是共享变量的行为,而不是

是的,该row变量已被捕获- 因此,无论何时读取它,它都是读取的最新值。您应该将变量声明放在循环中:

while (socket.Connected) {                
    string row = socket.readLine();

    if (IsControlValid(this)) {
        // Removed String.Copy call, as it was pointless
        BeginInvoke((MethodInvoker)delegate { UpdateForm(row); });
    }
}

现在,对于循环的每次迭代,您将拥有一个不同的变量,因此当您在委托中读取它时,您不会覆盖一个线程中的前一个值。

于 2013-09-26T18:19:40.323 回答