通过 BeginInvoke
调用 UI 控件上的操作没有问题,但是,这是一个 void
方法。我需要从文本框中获取一个值以用于不同的线程。
我怎样才能做到这一点?
最佳答案
最简单的解决方案是在闭包中捕获局部变量。
String text;
textBox.Invoke(() => text = textBox.Text);
编译器将生成一些与 chibacity 的解决方案非常相似的代码 - 局部变量成为编译器生成的类的一个字段。
更新
这不起作用 - lambda 表达式不可分配给 Delegate
。这个问题可以使用扩展方法来解决。
internal void ExecuteOnOwningThread(this Control control, Action action)
{
if (control.InvokeRequired)
{
control.Invoke(action);
}
else
{
action();
}
}
用法如下。
String text;
textBox.ExecuteOnOwningThread(() => text = textBox.Text);
可以将多个语句填充到 lambda 表达式中。
textBox.ExecuteOnOwningThread(() =>
{
DoStuff();
text = textBox.Text
DoOtherStuff();
});
但是正如 chibacity 已经在评论中提到的那样,显式编写一个方法可能会更好。超过某个点使用 lambda 表达式会对代码的可读性产生不利影响。而且使用lambda表达式当然很容易引入重复代码。
关于c# - 如何访问 UI 线程上的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937032/