2009-12-14 6 views
7

Jaka jest różnica pomiędzy oznakowaniem metodę WCF zJaka jest różnica między opcją [OperationContract (IsOneWay = true)] a sprawdzaniem wygenerowanych operacji asynchronicznych?

[OperationContract(IsOneWay = true)]

atrybutu i sprawdzanie generować pole asynchroniczne operacje podczas dodawania odniesienie usług?

Z tego, co przeczytałem, wydaje się, że asynchroniczny charakter połączenia powinien być zdefiniowany tylko po stronie klienta. Jeśli tak jest, jaki jest sens [OperationContract(IsOneWay = true)]?

W tej chwili po prostu mam następujące metody uruchomione w metodzie WCF.

public void UpdateIndex(IndexElement[] indexElements) 
    { 
     // start the update on a new thread. 
     Thread thread = new Thread(() => UpdateIndexThread(indexElements)); 
     thread.Start(); 
    } 

stworzyłem odniesienie w kodzie serwisowym mojego klienta, a ja po prostu zadzwonić:

indexerClient.UpdateIndex(indexElements); 

Gdzie indexerClient jest instancją mojego usług WCF.

Czy to też powinno działać? Wydaje się, że nie jest to prawie tak, jakby czekał na zakończenie wątku przed powrotem.

Odpowiedz

11

To są bardzo różne.

Na poziomie koncepcyjnym IsOneWay = true mówi, że wzorzec przesyłania wiadomości to "ogień i zapomnij" w przeciwieństwie do np. 'wymagać odpowiedzi'. Oznacza to, że IOW = true oznacza, że ​​istnieje komunikat od klienta do serwera, ale nie odpowiedź z serwera na klienta. W przeciwieństwie do tego metoda inna niż IOW = true będzie zwykle zawierała komunikat odpowiedzi, nawet jeśli typ zwracany jest nieważny (na przykład "pusty" komunikat).

Wzorzec asynchroniczny dotyczy zachowania kodu klienta - np. czy blokuje oczekiwanie na wartość zwracaną, czy nie. Async jest "lokalną" rzeczą, zobacz szczegóły: this blog. Możesz mieć klienta asynchronicznego dla serwera synchronizacji lub klienta synchronizacji dla serwera asynchronicznego. WCF zrobi magię pod maską, aby dać ci model programowania. Jeśli masz np. wzorzec przesyłania komunikatów żądanie-odpowiedź i użyj opcji "generuj asynchronię", wygenerowany klient da Ci np. metodę, którą możesz wywołać asynchronicznie (np. wyślij wiadomość i uzyskaj połączenie zwrotne, gdy nadejdzie odpowiedź).

więc użyć „asynchronicznie” dla „” lokalnego modelu programowania i używać IOW dla „wiadomości na drucie”.

Należy zauważyć, że w przykładzie, jeśli oznaczyć metodę IOW = true, to myślę, że nie ma powodu, dla Thread.Start() w kodzie serwera. Możesz po prostu wykonać pracę na tym samym wątku, który WCF podarował Twojemu serwerowi.

+0

To ma wiele sensu! Dziękuję bardzo - usuwa wiele frustracji! – Matt

+0

Po prostu wyjaśnić, to należy przeczytać w ten sposób, prawda? Oznacza to, IOW = true oznacza, że ​​nie jest to wiadomość od klienta do serwera, a odpowiedź od serwera do klienta. W przeciwieństwie do tego, nie IOW = sprawdzoną metodą zazwyczaj nie mają wiadomości z odpowiedzią, nawet jeżeli typ zwrotny jest nieważna (na przykład komunikat „pustym”). – Matt

+0

Dzięki, miałem jedno zdanie do tyłu, po prostu zredagowałem, aby naprawić. – Brian

Powiązane problemy