开始调用复制参数

本文关键字:参数 复制 调用 开始 | 更新日期: 2023-09-27 18:33:00

试着学习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)。

我错在哪里?

开始调用复制参数

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

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

while (socket.Connected) {                
    string row = socket.readLine();
    if (IsControlValid(this)) {
        // Removed String.Copy call, as it was pointless
        BeginInvoke((MethodInvoker)delegate { UpdateForm(row); });
    }
}
现在,循环

的每次迭代都有一个不同的变量,因此在委托中读取上一个值时,不会在一个线程中覆盖以前的值。