Я стал мучительно осознавать, как часто нужно писать следующий шаблон кода в коде 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
ярлык типа.
В предыдущих ответах обсуждалась непрактичность простого вызова Invoke () каждый раз, и даже тогда синтаксис Invoke () неэффективен и по- прежнему неудобен в обращении.
Итак, кто-нибудь разобрался в каких-либо сочетаниях клавиш?
источник
object1.InvokeIfNecessary.Visible = true
линией; Проверьте мой обновленный ответ и дайте мне знать, что вы думаете.Ответы:
Подход Ли может быть упрощен в дальнейшем
И можно так назвать
Нет необходимости передавать управление в качестве параметра делегату. C # автоматически создает замыкание .
ОБНОВЛЕНИЕ :
По нескольким другим постерам
Control
можно обобщить какISynchronizeInvoke
:DonBoitnott указал, что в отличие
Control
отISynchronizeInvoke
интерфейса требует массив объектов дляInvoke
метода в качестве списка параметров дляaction
.ОБНОВЛЕНИЕ 2
Изменения, предложенные Майком де Клерком (см. Комментарий в 1-м фрагменте кода для вставки):
См. Комментарий ToolmakerSteve ниже для беспокойства по поводу этого предложения.
источник
ISynchronizeInvoke
вместоControl
? (Слава Джону Скиту stackoverflow.com/questions/711408/… )ISynchronizeInvoke
. Но единственный тип, который вытекает из этого (согласно Reflector)Control
, так что преимущество ограничено.while (!control.Visible) ..sleep..
. Для меня это имеет неприятный запах кода, поскольку это потенциально неограниченная задержка (может быть, даже бесконечный цикл в некоторых случаях) в коде, который может иметь вызывающих абонентов, которые не ожидают такой задержки (или даже тупика). ИМХО, любое использованиеSleep
должно быть ответственностью каждого звонящего, ИЛИ должно быть в отдельной оболочке, которая четко помечена относительно его последствий. ИМХО, обычно было бы лучше «сильно потерпеть неудачу» (исключение, чтобы поймать во время тестирования), или «ничего не делать», если элемент управления не готов. Комментарии?InvokeRequired
сообщает, отличается ли вызывающий поток от потока, создавшего элемент управления.Invoke
передает действие из вызывающего потока в поток элемента управления, где оно выполняется. Это гарантирует, что, например, обработчик события щелчка никогда не прерывается.