Я стал мучительно знающий, как часто нужно записать следующий шаблон кода в событийно-ориентированном коде 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#, и чтобы помнить и ввести. Кто-либо придумал своего рода ярлык или создает, который автоматизирует это в известной степени? Было бы здорово, если бы был способ присоединить функцию к объектам, которая делает эту проверку, не имея необходимость проходить всю эту дополнительную работу, как a object1.InvokeIfNecessary.visible = true
введите ярлык.
Предыдущие ответы обсудили непрактичность просто вызова, Вызывают () каждый раз и даже затем Вызывание (), синтаксис является и неэффективным и все еще неудобным иметь дело с.
Так, кто-либо выяснил какие-либо ярлыки?
Вы можете написать метод расширения:
public static void InvokeIfRequired(this Control c, Action<Control> action)
{
if(c.InvokeRequired)
{
c.Invoke(new Action(() => action(c)));
}
else
{
action(c);
}
}
И использовать его так:
object1.InvokeIfRequired(c => { c.Visible = true; });
EDIT : Как указывает Симпзон в комментариях, вы также можете изменить подпись на:
public static void InvokeIfRequired<T>(this T c, Action<T> action)
where T : Control
Вот форма, которую я использовал во всем своем коде.
private void DoGUISwitch()
{
Invoke( ( MethodInvoker ) delegate {
object1.Visible = true;
object2.Visible = false;
});
}
Я основывал это на записи в блоге здесь . У меня не было этот подход меня не подводит, поэтому я не вижу причин усложнять свой код проверкой свойства InvokeRequired
.
Надеюсь, это поможет.