【发布时间】:2011-01-22 23:42:50
【问题描述】:
我已经痛苦地意识到需要在事件驱动的 GUI 代码中编写以下代码模式的频率,其中
private void DoGUISwitch() {
// cruisin for a bruisin' through exception city
object1.Visible = true;
object2.Visible = false;
}
变成:
private void DoGUISwitch() {
if (object1.InvokeRequired) {
object1.Invoke(new MethodInvoker(() => { DoGUISwitch(); }));
} else {
object1.Visible = true;
object2.Visible = false;
}
}
这是 C# 中的一个尴尬模式,无论是记忆还是打字。有没有人想出某种捷径或结构在一定程度上实现自动化?如果有一种方法可以将函数附加到执行此检查的对象而无需执行所有这些额外工作,例如object1.InvokeIfNecessary.visible = true 类型快捷方式,那就太棒了。
以前的answers 已经讨论过每次只调用 Invoke() 的不切实际,即使这样 Invoke() 语法既低效又仍然难以处理。
那么,有没有人想出捷径呢?
【问题讨论】:
-
我也想知道同样的事情,但是关于 WPF 的 Dispatcher.CheckAccess()。
-
受您的
object1.InvokeIfNecessary.Visible = true行的启发,我想出了一个相当疯狂的建议;查看我更新的答案,让我知道你的想法。 -
添加一个片段来帮助实施马特戴维斯建议的方法:见我的回答(迟到但只是向后来的读者展示如何;-))
-
我不明白为什么微软没有在 .NET 中简化它。从线程中为表单上的每个更改创建委托真的很烦人。
-
@Kamil 我完全同意!鉴于其无处不在,这是一种疏忽。在框架内,如有必要,只需处理线程即可。看起来很明显。
标签: c# multithreading winforms thread-safety invokerequired