2013-10-08 37 views
5

ServiceStack版本3ServiceStack「新」 API和異步等待

我很熟悉https://github.com/ServiceStack/ServiceStack/wiki/New-API和這個頁面上明確表示,「所有這些API具有異步等價物,您可以改用,當你需要至。」

是否有可能使用ServiceStack的新API的異步等待?

服務器和客戶端代碼與異步等待的樣子是什麼?

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

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

客戶

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

一定會請轉換爲異步這些同步的例子嗎?

回答

11

文檔中提到的「異步」方法不返回任務,因此它們不能與async/await照原樣一起使用。他們實際上需要回調才能成功或失敗。

E.g.爲GetAsync簽名是:

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

這是異步函數的APM風格,並且可以使用TaskCompletionSource轉換爲基於任務的功能,例如:

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

可以調用擴展方法像這樣:

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

可惜的是,我不得不說出原因很明顯的方法GetTask,即使約定追加Async到返回Task的方法。

+0

其實,你不能命名方法GetAsync嗎?簽名會有所不同,它應該解決好。但是,謝謝你明確表達,這些文檔中我不完全清楚。我會盡力解決這個問題的答案! –

+1

APM是一個非常具體的模式(使用'Begin'和'End'方法,'IAsyncResult'等),'GetAsync()'方法不適合它。它類似(基於回調),但不一樣。 – svick

+0

@svick meh,如果我使用擴展方法,我將使用GetAsync()。我猜如果你需要一些明確的表示,它會有所不同,儘管稍微有些,GetAsynchronous()/ GetAwaitable()會適合。 –

6

隨着ServiceStack 4,GetAsync現在返回一個任務,所以可以簡單地使用等待預期:

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

文檔瀏覽: https://github.com/ServiceStack/ServiceStack/wiki/C%23-client#using-the-new-api

注意:從我可以告訴ServiceStack V4有許多來自v3.x的重大改變,並且已經從BSD許可中移除了免費層的使用限制:https://servicestack.net/pricing,因此升級到4可能不是一種選擇。

+0

FWIW我特意澄清了這個問題僅僅是關於ServiceStack3,我沒有看到任何錯誤留下這個答案在這裏的完整性。 –

+1

Yea不確定它是否會對您有所幫助,因爲您最初並未指定版本。但是更多的是,無論如何,這個問題的其他觀衆可能會有所幫助。感謝您的更新 –