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()语法也是低效的,而且处理起来仍然很笨拙。
那么,有没有人想出什么捷径呢?
发布于 2017-10-02 12:13:08
用法:
control.InvokeIfRequired(c => c.Visible = false);
return control.InvokeIfRequired(c => {
c.Visible = value
return c.Visible;
});
代码:
using System;
using System.ComponentModel;
namespace Extensions
{
public static class SynchronizeInvokeExtensions
{
public static void InvokeIfRequired<T>(this T obj, Action<T> action)
where T : ISynchronizeInvoke
{
if (obj.InvokeRequired)
{
obj.Invoke(action, new object[] { obj });
}
else
{
action(obj);
}
}
public static TOut InvokeIfRequired<TIn, TOut>(this TIn obj, Func<TIn, TOut> func)
where TIn : ISynchronizeInvoke
{
return obj.InvokeRequired
? (TOut)obj.Invoke(func, new object[] { obj })
: func(obj);
}
}
}
https://stackoverflow.com/questions/2367718
复制相似问题