ServiceStack版本3
我对https://github.com/ServiceStack/ServiceStack/wiki/New-API非常熟悉,在这个页面上它特别说“所有这些API都有异步等效项,您可以在需要时使用它们。”
是否可以使用async等待ServiceStack的新api?
使用async等待服务器和客户端代码会是什么样的?
[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());
有些人请将这些同步示例转换为异步吗?
答案 0 :(得分: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
的方法。
答案 1 :(得分:7)
使用ServiceStack 4,GetAsync现在返回一个Task,因此可以按预期使用await:
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可能不是一种选择。