我知道,从任何非UI线程操纵UI控件时,您必须将您的调用编组到UI线程以避免问题。 一般的共识是你应该使用testingInvokeRequired,如果是true,则使用.Invoke来执行编组。 这导致了很多看起来像这样的代码: private void UpdateSummary(string text) { if (this.InvokeRequired) { this.Invoke(new Action(() => UpdateSummary(text))); } else { summary.Text = text; } } 我的问题是:我可以省略InvokeRequiredtesting,只需调用Invoke,如下所示: private void UpdateSummary(string text) { this.Invoke(new Action(() => summary.Text = text)); } 这样做有问题吗? 如果是这样,有没有更好的方法来保持InvokeRequiredtesting,而不必复制和粘贴这个模式到处?
我已经痛苦地意识到需要多长时间在事件驱动的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 = truetypes的快捷方式,那将会很酷。 以前的答案已经讨论过每次只调用Invoke()的不切实际的情况,即使如此,Invoke()语法也是效率低下,处理起来还是尴尬的。 那么,有没有人找出任何捷径?