首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BeginInvoke拷贝参数

BeginInvoke拷贝参数
EN

Stack Overflow用户
提问于 2013-09-26 18:17:17
回答 1查看 330关注 0票数 0

只要尝试学习Invoke/BeginInvoke,我就遇到了这个问题。

代码语言:javascript
复制
       // 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,我会看到错误的文本(一些文本重复了很多时间)。我知道那个电话

代码语言:javascript
复制
BeginInvoke((MethodInvoker)delegate { UpdateForm(row); });  

也许行可以是类似于共享变量的行为,而不是

代码语言:javascript
复制
BeginInvoke((MethodInvoker)delegate { UpdateForm(String.Copy(row)); });                    

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

我哪里错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-26 18:19:40

也许行可以是类似于共享变量的行为,而不是

是的,row变量是被捕获的-所以每当它被读取时,它就是读取的最新值。您应该将变量声明放入循环中:

代码语言:javascript
复制
while (socket.Connected) {                
    string row = socket.readLine();

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19035688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档