2013-10-08 16 views
5

phiên bản ServiceStack 3ServiceStack "mới" api và async chờ

Tôi khá quen thuộc với https://github.com/ServiceStack/ServiceStack/wiki/New-API và trên trang này nó đặc biệt nói "Tất cả các API này có tương đương async mà bạn có thể sử dụng thay vào đó, khi bạn cần đến."

Có thể sử dụng async đang chờ với api mới của ServiceStack không?

Mã máy chủ và mã khách hàng trông như thế nào với async đang chờ?

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

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

Khách hàng

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

có một số xin vui lòng chuyển đổi các ví dụ để đồng bộ không đồng bộ?

Trả lời

11

Các phương pháp "không đồng bộ" được đề cập trong tài liệu không trả lại Tác vụ để chúng không thể được sử dụng với async/await như chúng. Họ thực sự yêu cầu gọi lại để kêu gọi thành công hay thất bại.

Ví dụ: chữ ký cho GetAsync là:

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

Đây là APM-phong cách chức năng đồng bộ và có thể được chuyển đổi sang chức năng nhiệm vụ dựa trên sử dụng một TaskCompletionSource, ví dụ:

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; 
    } 

Bạn có thể gọi phương thức mở rộng như thế này:

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

Unfortunatelly, tôi đã đặt tên cho phương pháp GetTask vì những lý do rõ ràng, mặc dù quy ước là để phụ thêm Async đến các phương thức trả về Task.

+0

Thực ra, bạn có thể đặt tên cho phương thức GetAsync không? Chữ ký sẽ khác nhau và nó sẽ giải quyết tốt. Nhưng cảm ơn bạn đã làm rõ điều này, nó không hoàn toàn rõ ràng với tôi trong những tài liệu đó. Tôi sẽ cố gắng để có được xung quanh để cập nhật chúng với thông tin từ câu trả lời này! –

+1

APM là một mẫu rất cụ thể (với các phương thức 'Begin' và' End', 'IAsyncResult', vv) và phương thức' GetAsync() 'không phù hợp với nó. Nó tương tự (gọi lại), nhưng không giống nhau. – svick

+0

@svick meh, nếu tôi sử dụng phương pháp mở rộng, tôi sẽ sử dụng GetAsync(). Tôi đoán nếu bạn muốn một số biểu hiện rõ ràng nó khác nhau, mặc dù hơi, GetAsynchronous()/GetAwaitable() sẽ phù hợp. –

6

Với ServiceStack 4, GetAsync bây giờ trở về một nhiệm vụ, vì vậy có thể có thể chỉ cần sử dụng chờ đợi như mong đợi:

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

Tài liệu ở đây: https://github.com/ServiceStack/ServiceStack/wiki/C%23-client#using-the-new-api

Note: Từ những gì tôi có thể nói ServiceStack v4 có nhiều thay đổi đột phá từ v3.x và đã chuyển khỏi cấp phép BSD với giới hạn sử dụng cho cấp miễn phí của họ: https://servicestack.net/pricing, vì vậy việc nâng cấp lên 4 có thể không phải là một tùy chọn.

+0

FWIW tôi làm rõ cụ thể câu hỏi này chỉ là về ServiceStack3, tôi không thấy bất cứ điều gì sai trái với câu trả lời này ở đây để hoàn thành. –

+1

Yea không chắc liệu nó có hữu ích cho bạn hay không, vì bạn không chỉ định phiên bản ban đầu. Tuy nhiên, nhiều người nghĩ rằng nó có thể hữu ích cho những người xem khác của câu hỏi này.Cảm ơn bạn đã cập nhật –

Các vấn đề liên quan