VB.NET obsługuje anonimowych delegatów, ale tylko jako funkcje pojedynczego rachunku. (Anonimowe funkcje wielu oświadczeń i anonimowe Sub
s zostały dodane do VB10 w .NET 4)
Aby zapewnić kontekst, DoEvents
został zaprojektowany, aby umożliwić środowisku jednowątkowym aktualizację interfejsu użytkownika i przetwarzanie innych komunikatów systemu Windows podczas pracy gotowe. Nie powinno być żadnego pożytku z wywoływania DoEvents
(lub, jak to tutaj robisz, robiąc to pośrednio, wykonując funkcję "zerową" w module rozsyłającym) z innego wątku, ponieważ wątek interfejsu użytkownika powinien sam się aktualizować.
W interesie odpowiadając na pytanie, choć najprostszym rozwiązaniem byłoby coś takiego:
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
New Action(Function() 7))
Ale znowu, nie widzę, co by to rzeczywiście osiągnąć.
Jeśli to, czego szukasz, to po prostu jak wykonać kod w wątku UI (np. Control.Invoke
z formularzy Windows), to Dispatcher.Invoke
(którego używasz) jest poprawne, po prostu musisz Przetłumacz swoje inline anonimowe metody na dyskretne funkcje i przekazuj je jako delegatów. Być może niektóre z nich mogą uciec z powodu anonimowości. Na przykład, jeśli wszystko co robisz jest aktualizowanie pasek postępu, można zrobić:
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
New Action(Function() progressBar.Value = 100))
To działa, ponieważ wszystkie zadania zwrotu wartości, który został zapisany w lewej stronie przypisania. Państwo nie może jednak, po prostu zadzwoń sub tak (dodaje się nie skompiluje chyba SomeFunctionName
Zwraca wartości):
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
New Action(Function() SomeFunctionName(params)))
Innymi słowy, każdy z anonimowych delegatów, które są w kodzie C#, które albo :
- więcej niż jeden rachunek
- nie zwracają wartość (co oznacza to tylko jedno wywołanie metody, a nie funkcja)
Pokochasz więc h ave do tworzenia funkcji dla tych i przekazywać delegatów do tych funkcji, zamiast wpisywania kodu, jak masz w C#.
DoEvents? Sądzę, że używali DoEvents z powrotem w VB6, zanim ludzie zorientowali się, że aplikacja może mieć coś więcej niż tylko wątek interfejsu użytkownika. – Will
Cóż, nowoczesną konwencją jest użycie Thread.Sleep (1) lub podobnego, ale to nie działa, gdy trzeba tymczasowo wyskoczyć z wątku, aby umożliwić aktualizację interfejsu i pozostawać w środku pętli przetwarzania WPF. – NibblyPig
@SLC: Jeśli przetwarzasz dane w innym wątku, nie powinieneś mówić interfejsowi, aby aktualizował się (w zwykły sposób odświeżania). –