只要尝试学习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)。
我哪里错了?
发布于 2013-09-26 18:19:40
也许行可以是类似于共享变量的行为,而不是
是的,row变量是被捕获的-所以每当它被读取时,它就是读取的最新值。您应该将变量声明放入循环中:
while (socket.Connected) {
string row = socket.readLine();
if (IsControlValid(this)) {
// Removed String.Copy call, as it was pointless
BeginInvoke((MethodInvoker)delegate { UpdateForm(row); });
}
}现在,您将为循环的每一次迭代都有一个不同的变量,因此在您在委托中读取之前的值时,不会在一个线程中覆盖它。
https://stackoverflow.com/questions/19035688
复制相似问题