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).
哪里我错了?
也许"行"可以像共享变量一样行为而不是
是的,该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)
现在,对于循环的每次迭代,您将拥有一个不同的变量,因此当您在委托中读取它时,不会覆盖一个线程中的先前值.
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |