【问题标题】:ServiceStack "new" api and async awaitServiceStack“新”api和异步等待
【发布时间】:2013-10-08 15:25:14
【问题描述】:

ServiceStack 版本 3

我对@9​​87654321@ 非常熟悉,并且在此页面上它特别指出“所有这些 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());

能否将这些同步示例转换为异步示例?

【问题讨论】:

    标签: c# servicestack async-await servicestack-bsd


    【解决方案1】:

    文档中提到的“异步”方法不返回 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 的方法中。

    【讨论】:

    • 实际上,您不能将方法命名为 GetAsync 吗?签名会有所不同,它应该可以很好地解决。但是谢谢你说清楚,在那些文档中我并不完全清楚。我将尝试使用此答案中的信息更新它们!
    • APM 是一种非常具体的模式(使用BeginEnd 方法,IAsyncResult 等),GetAsync() 方法不适合它。类似(基于回调),但不一样。
    • @svick meh,如果我使用扩展方法,我将使用 GetAsync()。我想如果你想要一些明确的表示,它会有所不同,尽管略有不同,GetAsynchronous() / GetAwaitable() 会适合。
    【解决方案2】:

    使用 ServiceStack 4,GetAsync 现在返回一个任务,因此可以像预期的那样简单地使用 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 可能不是一个选项。

    【讨论】:

    • FWIW 我特别澄清了这个问题只是关于 ServiceStack3,我认为为了完整起见将这个答案留在这里没有任何问题。
    • 是的,不确定它是否对您有帮助,因为您最初没有指定版本。但更多的是认为它可能对这个问题的其他观众有所帮助。感谢更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2015-02-03
    • 2017-04-17
    • 2018-11-29
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多