开始调用复制参数
本文关键字:参数 复制 调用 开始 | 更新日期: 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); });
}
}
现在,循环的每次迭代都有一个不同的变量,因此在委托中读取上一个值时,不会在一个线程中覆盖以前的值。