2009-08-13 15 views
25

This page in the MS documentation, obejmujące asynchrony w aplikacji Windows Forms, stwierdza:Czy za każdym razem, po rozpoczęciu Invinvoke, musi nastąpić EndInvoke?

Można zadzwonić EndInvoke odzyskać wartości zwracanej od delegata, jeśli neccesary, ale nie jest to wymagane. (podkreślenie dodane)

This page covering the general case of asynchronous delegates, twierdzi coś innego:

Bez względu na to, która z technik użyć, zawsze zadzwonić EndInvoke aby zakończyć asynchroniczne wywołanie.

Te dwa wydają się być w bezpośrednim konflikcie.

Co jest prawdą? Czy ktoś może wyjaśnić?

patrz również, a post by Phil Haack.

pokrewne: Is EndInvoke optional, sort-of optional, definitely not optional?

Odpowiedz

22

O ile w dokumentacji interfejsu wyraźnie nie podano inaczej, należy wywoływać EndInvoke dla każdego miejsca, które wywołuje BeginInvoke. Głównym powodem jest to, że EndInvoke jest jedynym czasem, w którym właściciel może bezpiecznie uwolnić określone zasoby, które mogą zostać przydzielone na wywołanie BeginInvoke (takie jak WaitHandle).

Istnieją jednak wyjątki od tej reguły. Interfejsy API, takie jak Control.BeginInvoke, nie wymagają EndInvoke, ale są wyraźnie określone w dokumentacji.

13

Oba są prawdziwe - są różne połączenia.

Generalnie należy zawsze dzwonić pod numer EndInvoke, aby zapewnić, że wszystkie zasoby pozyskane przez wywołanie asynchroniczne zostaną zwolnione.

Jednak zespół Windows Forms zagwarantował, że nie trzeba tego robić dla Control.Invoke. Być może jednak trzeba to zrobić dla innych implementacji ISynchronizeInvoke.

+0

Zgadzam się z większością odpowiedzi, z wyjątkiem komentarza, że ​​są to "różne połączenia". Wcale nie wydają się być różnymi połączeniami. Czy obaj nie rozmawiają o EndInvoke na delegatach asynchów? Po prostu EndInvoke na delegatach kontrolnych jest szczególnym przypadkiem. – Cheeso

+3

@Cheeso: Nie - Control.BeginInvoke nie jest połączeniem * on * delegata w ogóle. * Bierze * delegata. –

1

Użyłem metody "zapomnij i zapomnij" u delegatów, zanim wyniki były "użyteczne, jeśli są dostępne, ale niewymagane". Pamiętaj tylko, że nie masz żadnych gwarancji ukończenia tej metody. W szczególności, tutaj jest jedno miejsce, które mogę używać go:

  • Zacznij delegata, aby sprawdzić dostępność aktualizacji aplikacji
  • Delegat zaczyna prośbę internetowej z timeout
  • W przypadku wystąpienia błędu/timeout, lub jeżeli wniosek jest up-to-date, metoda zwraca po prostu
  • Jeśli aplikacja jest nieaktualna, że ​​umieszczenie (brak ikony w zasobniku, chyba że jest dostępna aktualizacja) non-Focus-kradzież zasobniku komunikat informujący, więc

Tak czy inaczej, th Aplikacja działa nieprzerwanie.

Powiązane problemy