2009-08-17 13 views
8

Dlaczego klasy proxy (proxy) wygenerowane przez Silerlight oferują tylko połączenia asynchroniczne?Silverlight WCF Proxy tylko asynchronicznie?

Istnieją przypadki, w których naprawdę nie potrzebują wzór asynchronicznej (na przykład w BackgroundWorker)

EDIT: Czasami trzeba przetwarzać wyniki dwóch WCF połączeń. Byłoby o wiele prostsze, gdybym mógł czekać (sprawa aplikacji na to pozwala) dla obu połączeń, aby zakończyć, a następnie przetwarzać .. ale noooo .... asynchronicznie! : P

Odpowiedz

6

Jest w istocie techniczny powód, dla którego nie można wykonywać połączeń synchronizacyjnych, przynajmniej z głównego wątku przeglądarki, czyli że przeglądarka wywołuje wszystkie wywołania API wtyczek w tym samym wątku, więc jeśli SL ma zablokuj ten wątek podczas oczekiwania na oddzwanianie sieci, połączenie z siecią nie zostanie przerwane, a aplikacja zablokuje się. Mimo to interfejs API synchronizacji działałby dobrze, gdyby został zainicjowany z innego wątku - tj. Jeśli aplikacja najpierw wykona polecenie QueueUserWorkItem w celu usunięcia wątku przeglądarki - ale uważaliśmy, że byłoby to mylące oferowanie opcji synchronizacji i posiadanie jej tylko pracują przez jakiś czas.

+1

To wstyd, że nie może istnieć interfejs API synchronizacji, który po prostu wyrzuca przydatny wyjątek (np. "Ta funkcja jest synchroniczna, więc może być wywołana tylko przez wątki inne niż UI"), gdy zostanie wywołana z wątku interfejsu użytkownika. – Gabe

7

Jak rozumiem, celem jest tutaj utrudnienie ludziom robienia niewłaściwych rzeczy (synchronizacja IO z interfejsu użytkownika). Jeśli korzystasz z klas WCF, prawdopodobnie będziesz musiał z tym żyć.

+2

+1 uniemożliwić twórcy Silverlight robienie sobie zdjęć w stopach :-) –

+2

Silverlight umożliwia tylko nawiązywanie połączeń sieciowych w wątku interfejsu użytkownika (nie jest pewne, czy może to być ograniczenie przeglądarki) także). Dlatego synchronizacja IO zablokuje przeglądarkę, coś złego. –

+0

"uniemożliwić twórcy Silverlight strzelanie sobie w stopy"; teraz muszę poczekać na 4 asynchroniczne żądania, aby zebrać dane i przedstawić je i nie mogę strzelać sobie w stopę. Środowisko uruchomieniowe zastrzelił mnie w stopie. Wygodny .. –

0

Andrei, istnieją pewne metody, które nawet przy użyciu asynchronicznego wzorca, pozwalają pisać ekspresyjny kod, łatwy do odczytania i utrzymywania, bez stania się szalonym, wysyłając 4 asynchroniczne żądania, po prostu upraszczając sposób pisania kodu. zwróć uwagę na tę bibliotekę http://syncwcf.codeplex.com/