gpt4 book ai didi

c# - ServiceStack "new"api 和异步等待

转载 作者:太空狗 更新时间:2023-10-29 20:50:14 26 4
gpt4 key购买 nike

ServiceStack 版本 3

我很熟悉https://github.com/ServiceStack/ServiceStack/wiki/New-API在这个页面上,它特别指出“所有这些 API 都有异步等效项,您可以在需要时使用它们。”

是否可以通过 ServiceStack 的新 API 使用异步等待?

使用 async await 的服务器和客户端代码会是什么样子?

[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());

有人可以将这些同步示例转换为异步示例吗?

最佳答案

文档中提到的“async”方法不返回 Task,因此它们不能按原样与 async/await 一起使用。他们实际上需要回调来调用成功或失败。

例如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 的方法。

关于c# - ServiceStack "new"api 和异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19251904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com