BeginInvoke复制参数

Kai*_*r69 0 c# multithreading begininvoke winforms

只是尝试学习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)); });                    

        }
    }
Run Code Online (Sandbox Code Playgroud)

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

BeginInvoke((MethodInvoker)delegate { UpdateForm(row); });  
Run Code Online (Sandbox Code Playgroud)

也许"行"可以像共享变量一样行为而不是

BeginInvoke((MethodInvoker)delegate { UpdateForm(String.Copy(row)); });                    
Run Code Online (Sandbox Code Playgroud)

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

哪里我错了?

Jon*_*eet 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); });
    }
}
Run Code Online (Sandbox Code Playgroud)

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