2009-09-03 9 views
15

Zauważyłam następujące wzór niedawno, ale nie całkowicie zrozumieć wykorzystanie właściwości completedSynchronously:AsyncCallback completedSynchronously

IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel); 
if (channelOpenResult.CompletedSynchronously) 
{ 
    CompleteOpenChannel(channelOpenResult); 
} 

I znowu, w callback:

void OnOpenCompleteChannel(IAsyncResult result) 
{ 
    if (result.CompletedSynchronously) 
     return; 
    else 
     CompleteOpenChannel(result); 
} 

I gdzieś w kodzie jest oczywiście funkcja:

void CompleteOpenChannel(IAsyncResult result) ... 

Czy jest to sposób obsługi e asynchroniczne wywołanie różni się w zależności od tego, czy zakończy się bezpośrednio, czy nie? Ale po co go używać w tym przypadku, ponieważ AsyncCallback będzie zawsze wywoływany (prawda?)? Czy ktoś mógłby podać przykład połączenia synchronicznego?

Odpowiedz

8

Zobacz this blog. Wspólny wzorzec działa asynchronicznie w pętli, a sprawdzenie CompletedSynchronously pomaga uniknąć przypadku, w którym uzyskasz "pecha", a grupa asynchronicznych wywołań zakończy synchronizację i narazi Cię na wyjątek StackOverflowException. (Np. Jeśli czytasz dane przez sieć, a dane, które czytasz, już przechodzą przez przewód i są buforowane, twoje połączenie asynchroniczne może zakończyć się synchronicznie, co oznacza, że ​​twoje wywołanie zwrotne jest wywoływane w tym samym wątku (z wyższym stosu), co oznacza, że ​​lepiej nie planować kolejnego asynchronicznego połączenia w pętli.)

0

Zgodnie z tym document można dostarczyć połączenie z wywołania synchronicznego i ASync i tylko wtedy, gdy połączenie nie było obsługiwane synchronicznie, będzie wywoływać metody ASync. Nie sądzę, że to naprawdę dotyczy Silverlight (ponieważ wszystkie wywołania Silverlight są ASync do pewnego stopnia), ale prawdopodobnie jest używany bardziej do niestandardowych fabryk w innych aplikacjach .NET.

Mam nadzieję, że to pomoże.

Powiązane problemy