2009-09-01 11 views

Odpowiedz

14

To w zasadzie opisuje drogę do pchania pracę pomiędzy wątkami; aby przepchnąć element pracy na inny wątek, użyj albo Invoke (synchroniczny) albo BeginInvoke (asynchroniczny - w idealnym przypadku wywołanie później EndInvoke). Podobnie, InvokeRequired jest używane do pytania "czy muszę to zrobić? Lub czy mogę wykonać pracę samodzielnie?".

Najczęstszym zastosowaniem tego interfejsu są formularze okien, w których jest to część przenoszenia pracy na wątek interfejsu użytkownika; możesz oczywiście używać tego samego, co jednak, ale formanty kontrolek implementują ten interfejs, aby umożliwić abstrakcję - więc kod źródłowy nie musi wiązać się z formularzami systemu Windows. W przypadku formularzy, InvokeRequired oznacza "czy jestem wątkiem UI?".

W rzeczywistości nie jestem pewien, czy powszechne jest używanie go bezpośrednio. Częściej radzi sobie z zdarzeniami w interfejsie użytkownika, a interfejs użytkownika obsługuje przełączanie wątków za pomocą najbardziej odpowiedniego mechanizmu lokalnego.

Typowe zastosowanie:

obj.Invoke((MethodInvoker) SomeMethod); 

który wykonuje (za pośrednictwem pełnomocnika) SomeMethod na gwint zarządzanego przez obj (który realizuje Interface).

+0

dzięki marc to świetna odpowiedź .. –

+0

Niedawno obejrzałem bardzo łatwą implementację 'ISynchronizeInvoke' w połączeniu z bardzo prostą implementacją' IAsyncResult': http://gurkashi.blogspot.com/2011/01/hi-all- w tym-post-i-will-demon.html. Nie do hi-jack pytanie, ale zastanawiam się, czy teraz, z .NET 4.5 mogę używać async/czekać zamiast old-school wzór BeginInvoke z callbacks. Mimo że interfejs mówi "BeginInvoke", * pod maską * mogę zaimplementować z mojego 4.5 przybornika. – IAbstract

2

ISynchronizeInvoke Interface

Interfejs ISynchronizeInvoke synchroniczne i asynchroniczne komunikację między obiektami o wystąpieniu zdarzenia. Obiekty , które implementują ten interfejs, mogą uzyskać powiadomienie o zdarzeniu, które miało , i mogą odpowiadać na zapytania o dane zdarzenie z . W ten sposób klienci mogą upewnić się, że jedno żądanie zostało przetworzone przed przesłaniem kolejnego żądania, które zależy od ukończenia pierwszego żądania od .

Patrz także

http://blogs.msdn.com/jaredpar/archive/2008/01/07/isynchronizeinvoke-now.aspx

+0

Yap..i myślisz, że to może być używane do aktualizacji UI w głównym wątku za pomocą wątku tła logiki niższego poziomu? –

Powiązane problemy