Анонимный метод в вызове Invoke

Имея немного проблем с синтаксисом, когда мы хотим анонимно вызвать делегат в Control.Invoke.

Мы пробовали целый ряд разных подходов, все безрезультатно.

Например:

myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); }); 

где someParameter является локальным для этого метода

Приведенное выше приведет к ошибке компилятора:

Невозможно преобразовать анонимный метод, чтобы ввести «System.Delegate», поскольку он не является типом делегата

6 Solutions collect form web for “Анонимный метод в вызове Invoke”

Поскольку Invoke / BeginInvoke принимает Delegate (а не типизированный делегат), вам нужно сообщить компилятору, какой тип делегата создать; MethodInvoker (2.0) или Action (3.5) являются общими выборами (обратите внимание, что они имеют одну и ту же подпись); вот так:

 control.Invoke((MethodInvoker) delegate {this.Text = "Hi";}); 

Если вам нужно передать параметры, то «захваченные переменные» будут следующими:

 string message = "Hi"; control.Invoke((MethodInvoker) delegate {this.Text = message;}); 

(остерегайтесь: вы должны быть немного осторожны, если используете асинхронные захваты, но синхронизация прекрасна – то есть, это хорошо)

Другой вариант – написать метод расширения:

 public static void Invoke(this Control control, Action action) { control.Invoke((Delegate)action); } 

тогда:

 this.Invoke(delegate { this.Text = "hi"; }); // or since we are using C# 3.0 this.Invoke(() => { this.Text = "hi"; }); 

Конечно, вы можете сделать то же самое с BeginInvoke :

 public static void BeginInvoke(this Control control, Action action) { control.BeginInvoke((Delegate)action); } 

Если вы не можете использовать C # 3.0, вы можете сделать то же самое с обычным методом экземпляра, предположительно в базовом classе Form .

На самом деле вам не нужно использовать ключевое слово delegate. Просто передайте lambda в качестве параметра:

 control.Invoke((MethodInvoker)(() => {this.Text = "Hi"; })); 
 myControl.Invoke(new MethodInvoker(delegate() {...})) 

Вам нужно создать тип делегата. Ключевое слово «делегат» в создании анонимного метода немного вводит в заблуждение. Вы не создаете анонимного делегата, а анонимный метод. Созданный вами метод может использоваться в делегате. Как это:

 myControl.Invoke(new MethodInvoker(delegate() { (MyMethod(this, new MyEventArgs(someParameter)); })); 

Для полноты, это также может быть выполнено с помощью комбинации метода действий / анонимного метода:

 //Process is a method, invoked as a method group Dispatcher.Current.BeginInvoke((Action) Process); //or use an anonymous method Dispatcher.Current.BeginInvoke((Action)delegate => { SomeFunc(); SomeOtherFunc(); }); 

У меня были проблемы с другими предложениями, потому что я хочу иногда возвращать значения из моих методов. Если вы попытаетесь использовать MethodInvoker с возвращаемыми значениями, ему это не похоже. Итак, решение, которое я использую, похоже на это (очень рад услышать способ сделать это более кратким – я использую c # .net 2.0):

  // Create delegates for the different return types needed. private delegate void VoidDelegate(); private delegate Boolean ReturnBooleanDelegate(); private delegate Hashtable ReturnHashtableDelegate(); // Now use the delegates and the delegate() keyword to create // an anonymous method as required // Here a case where there's no value returned: public void SetTitle(string title) { myWindow.Invoke(new VoidDelegate(delegate() { myWindow.Text = title; })); } // Here's an example of a value being returned public Hashtable CurrentlyLoadedDocs() { return (Hashtable)myWindow.Invoke(new ReturnHashtableDelegate(delegate() { return myWindow.CurrentlyLoadedDocs; })); } 
  • дополнительная ошибка квалификации в C ++
  • Почему эта программа ошибочно отвергается тремя компиляторами C ++?
  • R не может быть разрешен - ошибка Android
  • Вывод типа Java: ссылка неоднозначна в Java 8, но не Java 7
  • Ошибка в classе Swift: свойство не инициализировано при вызове super.init
  • Что означает «возможное преобразование с потерями» и как его исправить?
  • Странная ошибка связывания: отсутствует DSO из командной строки
  • Ошибка компилятора: «Инициализатор не является константой времени компиляции»
  • Определение манифеста размещенной сборки не соответствует ссылке на сборку
  • Методы расширения должны быть определены в неэквивалентном статическом classе
  • Почему вектор :: ссылка не возвращает ссылку на bool?
  • Interesting Posts

    На каких платформах есть что-то, кроме 8-битного символа?

    Как заставить Qt работать, когда основной stream занят?

    Paragon ExtFS не может записывать файлы на диск Ext4 из Windows 10

    Как использовать регулярное выражение в SQLite-запросе?

    Как выполнить единичный тест сохранения файла на диск?

    Как нарисовать в JPanel? (Swing / графика Java)

    Генерация CSR OpenSSL с ключевым ключом от stdin

    Почему неподписанное целочисленное переполнение определенного поведения, но недопустимое целочисленное число целых чисел?

    Отладка и производительность релиза

    Z3: поиск всех удовлетворяющих моделей

    Как восстановить поврежденные системные файлы с установочного диска

    Есть ли инструмент Windows для разделителя рабочего стола (обработка одного дисплея в виде двух меньших дисплеев)

    eclipse с Android sdk, ERROR: пространство кучи Java

    Как создать список Spinner с помощью CustomAdapter в android

    Можно ли зашифровать домашнюю папку на окнах 7?

    Давайте будем гением компьютера.