Twoje pytanie jest trochę niejasny (powinno być count <=
?), Ale tu idzie ...
co prosicie o to jak zrobić synchronicznego połączenia. W przypadku połączenia asynchronicznego, zanim wykonasz wywołanie, przypiszesz funkcję obsługi zdarzenia, która zostanie wywołana po zakończeniu połączenia, a następnie wykonasz połączenie. Oznacza to, że kod zakończenia jest w innej funkcji niż kod wywołujący. Oznacza to, że jeśli twoje połączenie asynchroniczne zostanie wykonane w wątku UI, interfejs użytkownika nie będzie blokował się podczas wykonywania połączenia.
Połączenia synchronizacyjne są możliwe w Silverlight, ale musisz upewnić się, że nie robisz ich w wątku UI. Jednym ze sposobów osiągnięcia tego jest rozpoczęcie nowego wątku tła, wykonanie asynchronicznego wywołania w wątku tła, ale zablokowanie powrotu, dopóki połączenie nie zostanie zakończone. Oto przykładowy kod pseudo:
private AutoResetEvent myResetEvent;
private void MyCallFunction(object someParameter) {
if (this.Dispatcher.CheckAccess())
{
Action<object> a = new Action<object>(MyCallFunction);
a.BeginInvoke(someParameter, null, null);
return;
}
myResetEvent = new AutoresetEvent();
myAsyncCall.CallCompleted += new EventHandler<>(myAsyncCall_CallCompleted);
myAsyncCall.DoAsyncCall(someParameter);
myResetEvent.WaitOne();
//increment your count here
}
private void myAsyncCall_CallCompleted(object sender, SomeEventArgs e) {
if (e.Error == null && !e.Cancelled) {
if (myResetEvent != null)
myResetEvent.Set();
}
}
Zauważ, że ten kod nie jest szczególnie wątku bezpieczne lub produkcja gotowy - to po prostu szybki próbki.
To, co się dzieje, polega na tym, że po wpisaniu MyCallFunction
sprawdza, czy działa w wątku interfejsu użytkownika, jeśli jest, to ponownie wywołuje się w wątku tła. Następnie ustawia AutoResetEvent i wykonuje wywołanie asynchroniczne.Następnie zatrzymuje się na obiekcie myResetEvent
, dopóki nie zostanie ustawiony (lub "zasygnalizowany") z obsługi zakończonej wywołania, przy której wykonanie kodu punktu będzie kontynuowane. Zauważ, że nie powinieneś próbować uzyskać dostępu do formantu bezpośrednio z tego kodu bez uprzedniego upewnienia się, że jesteś ponownie w wątku UI.
Kiedy zacząłem pracować, jak to zrobić w Silverlight, zacząłem od this SO post, i kontynuowałem z this link. Ale jak mówi Marc Gravell w pierwszym poście, nie rób tego, jeśli możesz tego uniknąć. Jedyne, co musiałem zrobić, to gdy musiałem zebrać wyniki kilku różnych wywołań WCF do jednego wyniku, który został zwrócony do interfejsu użytkownika (i te połączenia nie mogły być połączone z jedną metodą WCF w stylu fasady).
Semafor na Silverlight? –