Автоматизация шаблона кода InvokeRequired

Я стал мучительно знающий, как часто нужно записать следующий шаблон кода в событийно-ориентированном коде 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 введите ярлык.

Предыдущие ответы обсудили непрактичность просто вызова, Вызывают () каждый раз и даже затем Вызывание (), синтаксис является и неэффективным и все еще неудобным иметь дело с.

Так, кто-либо выяснил какие-либо ярлыки?

177
задан Community 23 May 2017 в 11:47
поделиться

2 ответа

Вы можете написать метод расширения:

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
133
ответ дан 23 November 2019 в 20:19
поделиться

Вот форма, которую я использовал во всем своем коде.

private void DoGUISwitch()
{ 
    Invoke( ( MethodInvoker ) delegate {
        object1.Visible = true;
        object2.Visible = false;
    });
} 

Я основывал это на записи в блоге здесь . У меня не было этот подход меня не подводит, поэтому я не вижу причин усложнять свой код проверкой свойства InvokeRequired .

Надеюсь, это поможет.

33
ответ дан 23 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: