VB.NET поддерживает анонимные делегат, но только как функции одного заявления. (Анонимные анонимные функции и анонимные анонимные Sub
s были добавлены в VB10 в .NET 4)
Для обеспечения контекста DoEvents
был разработан, чтобы позволить однопоточной среде обновлять пользовательский интерфейс и обрабатывать другие сообщения Windows во время работы делается. Не должно быть никакой пользы для вызова DoEvents
(или, как вы здесь делаете, косвенно, выполняя функцию «null» на диспетчере) из другого потока, так как поток пользовательского интерфейса должен обновляться сам по себе.
В интересах отвечая на ваш вопрос, хотя, самый простой вариант будет что-то вроде этого:
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))
Это работает, потому что все задания возвращает значение, которое было сохранено в левой части присваивания. Можно, однако, не только вызвать к югу, как это (следующий не будет компилироваться, если только SomeFunctionName
возвращает значение):
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
New Action(Function() SomeFunctionName(params)))
Другими словами, любой из анонимных делегатов, которые в коде C#, что либо :
- более чем один оператор
- не возвращают значение (то есть это только один вызов метода, а не функция)
Тогда вы будете ч ave для создания функций для этих лиц и передачи делегатов этим функциям, а не сложения кода, как у вас на C#.
DoEvents? Я полагаю, что они использовали DoEvents в VB6, прежде чем люди поняли, что приложение может иметь больше, чем просто поток пользовательского интерфейса. – Will
Ну, современное соглашение - использовать Thread.Sleep (1) или подобное, но это не работает, когда вам нужно временно выходить из потока, чтобы пользовательский интерфейс мог обновить себя и оставаться в середине цикла обработки в WPF. – NibblyPig
@SLC: Если вы делаете свою обработку в другом потоке, вам не нужно будет сообщать пользовательскому интерфейсу об обновлении (только в общем режиме обновления). –