2013-10-08 16 views
5

wersja ServiceStack 3ServiceStack „nowy” api i asynchroniczny czekają

jestem dość obeznany z https://github.com/ServiceStack/ServiceStack/wiki/New-API i na tej stronie to specjalnie mówi: „Wszystkie te async API mają odpowiedniki, które można używać zamiast, gdy trzeba do."

Czy można korzystać z async z nowym api ServiceStack?

Jak wyglądałby serwer i kod klienta z asynchronizacją?

[Route("/reqstars")] 
public class AllReqstars : IReturn<List<Reqstar>> { } 

public class ReqstarsService : Service 
{ 
    public List<Reqstar> Any(AllReqstars request) 
    { 
     return Db.Select<Reqstar>(); 
    } 
} 

Client

var client = new JsonServiceClient(BaseUri); 
List<Reqstar> response = client.Get(new AllReqstars()); 

Czy niektórzy proszę przekonwertować te synchroniczne Przykłady Aby asynchroniczny?

Odpowiedz

11

Metody "asynchroniczne" wymienione w dokumentacji nie zwracają Zadanie, więc nie mogą być używane z async/await takimi, jakie są. W rzeczywistości wymagają one oddzwonienia, aby nawiązać połączenie z sukcesem lub porażką.

E.g. podpis na GetAsync jest:

public virtual void GetAsync<TResponse>(string relativeOrAbsoluteUrl, 
    Action<TResponse> onSuccess, 
    Action<TResponse, Exception> onError) 

To APM-style funkcji asynchronicznych i mogą być konwertowane do funkcji opartych na zadaniach stosując TaskCompletionSource, np:

public static Task<TResponse> GetTask<TResponse>(this JsonServiceClient client, string url) 
    { 
     var tcs = new TaskCompletionSource<TResponse>(); 

     client.GetAsync<TResponse>(url, 
      response=>tcs.SetResult(response), 
      (response,exc)=>tcs.SetException(exc) 
      ); 

     return tcs.Task; 
    } 

Można wywołać metodę rozszerzenia tak:

var result = await client.GetTask<SomeClass>("someurl"); 

Niestety, musiałem wymienić metodę GetTask z oczywistych względów, mimo że konwencja ma dołączyć Async do metod, które zwracają Task.

+0

Właściwie, czy nie mógłbyś nazwać metody GetAsync? Podpisy byłyby różne i powinno to rozwiązać grzywnę. Ale dziękuję ci za wyjaśnienie, nie było dla mnie jasne w tych dokumentach. Postaram się je zaktualizować, podając informacje z tej odpowiedzi! –

+1

APM jest bardzo specyficznym wzorcem (z metodami 'Begin' i' End', 'IAsyncResult', itp.) I metodą' GetAsync() 'nie pasuje do tego. Jest podobny (oparty na oddzwanianiu), ale nie taki sam. – svick

+0

@ Sickick meh, jeśli użyję metody rozszerzenia, użyję GetAsync(). Domyślam się, że jeśli chcesz mieć jakąś wyraźną denotację, to jest inna, choć nieznacznie, pasuje GetAsynchronous()/GetAwaitable(). –

6

Z ServiceStack 4, GetAsync teraz powraca zadania, dzięki czemu można po prostu użyć czekają zgodnie z oczekiwaniami:

var client = new JsonServiceClient(BaseUri); 
var response = await client.GetAsync(new AllReqstars()); 

Dokumentacja tutaj: https://github.com/ServiceStack/ServiceStack/wiki/C%23-client#using-the-new-api

Uwaga: Z tego, co mogę powiedzieć ServiceStack v4 ma wiele przełomowych zmian z wersji 3.x i odszedł od licencjonowania BSD z ograniczeniami użycia dla ich darmowej warstwy: https://servicestack.net/pricing, więc aktualizacja do 4 może nie być opcją.

+0

FWIW Wyjaśniłem, że to pytanie dotyczy tylko ServiceStack3, nie widzę nic złego w pozostawianiu tej odpowiedzi tutaj dla kompletności. –

+1

Nie byłem pewien, czy byłoby to pomocne dla Ciebie, czy nie, ponieważ nie określiłeś wersji oryginalnej. Ale bardziej myślał, że i tak może to być pomocne dla innych użytkowników tego pytania.Dziękujemy za aktualizację –

Powiązane problemy