VB.NET поддерживает анонимных делегатов, но только как функции с одним оператором. (Анонимные функции с несколькими утверждениями и анонимные Sub
были добавлены в VB10 в .NET 4)
Для обеспечения контекста DoEvents
был разработан, чтобы позволить однопоточной среде обновлять пользовательский интерфейс и обрабатывать другие сообщения Windows во время работы. Не должно быть никакой пользы от вызова DoEvents
(или, как вы делаете здесь, косвенного выполнения путем выполнения «нулевой» функции в диспетчере) из другого потока, поскольку поток пользовательского интерфейса должен обновляться сам по себе.
В интересах ответа на ваш вопрос, однако, самый простой вариант будет выглядеть примерно так:
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
New Action(Function() 7))
Но, опять же, я не вижу, чего бы это на самом деле достигло.
Если вам нужно просто выполнить код в потоке пользовательского интерфейса (например, Control.Invoke
из форм Windows), тогда Dispatcher.Invoke
(то, что вы используете) будет правильным, вы просто нужно перевести свои встроенные анонимные методы в дискретные функции и передать их в качестве делегатов. Там могут быть некоторые, которые вы можете оставить как анонимный. Например, если все, что вы делаете, это обновление индикатора выполнения, вы можете сделать:
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
New Action(Function() progressBar.Value = 100))
Это работает, потому что все назначения возвращают значение, которое было сохранено в левой части назначения. Вы не можете, однако, просто вызвать sub как этот (следующее не скомпилируется, если SomeFunctionName
не вернет значение):
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
New Action(Function() SomeFunctionName(params)))
Другими словами, любой из анонимных делегатов в коде C #, который либо:
- Более одного утверждения
- Не возвращать значение (т. Е. Это всего лишь один вызов метода, а не функции)
Тогда вам нужно будет создать функции для них и передать делегаты этим функциям, а не вставлять код, как в C #.