服务堆栈版本 3
我很熟悉https://github.com/ServiceStack/ServiceStack/wiki/New-API https://github.com/ServiceStack/ServiceStack/wiki/New-API在此页面上,它特别指出“所有这些 API 都有异步等效项,您可以在需要时使用它们”。
是否可以将 async wait 与 ServiceStack 的新 api 一起使用?
使用 async wait 时,服务器和客户端代码会是什么样子?
[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());
有人可以将这些同步示例转换为异步吗?
文档中提到的“异步”方法不返回任务,因此它们不能与async/await
像他们那样。它们实际上需要回调来调用成功或失败。
例如。的签名GetAsync
is :
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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)