【问题标题】:How to use RestSharp with async/await如何将 RestSharp 与 async/await 一起使用
【发布时间】:2014-03-13 19:19:18
【问题描述】:

我正在努力寻找一些将 RestSharp 与 asyncawait 结合使用的异步 C# 代码的现代示例。我知道有been a recent update by Haack,但我不知道如何使用新方法。

另外,我如何提供取消令牌以便取消操作(例如,如果有人厌倦了等待并按下应用 UI 中的取消按钮)。

【问题讨论】:

    标签: c# .net asynchronous async-await restsharp


    【解决方案1】:

    嗯,Haack 所指的更新是由我制作的 :) 所以让我向您展示如何使用它,因为它实际上非常简单。以前你有像ExecuteAsyncGet 这样的方法,它会返回一个名为RestRequestAsyncHandle 的RestSharp 自定义类型。无法等待此类型,因为 async/await 适用于 TaskTask<T> 返回类型。我的拉取请求向返回 Task<T> 实例的现有异步方法添加了重载。这些Task<T> 重载在其名称中添加了一个“任务”字符串,例如ExecuteAsyncGetTask<T> 重载称为ExecuteGetTaskAsync<T>。对于每个新的Task<T> 重载,有一种方法不需要指定CancellationToken,而有一种方法可以这样做。

    现在来看一个如何使用它的实际示例,它还将展示如何使用CancellationToken

    private static async void Main()
    {
        var client = new RestClient();
        var request = new RestRequest("http://www.google.com");
        var cancellationTokenSource = new CancellationTokenSource();
    
        var restResponse = 
            await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);
    
        // Will output the HTML contents of the requested page
        Console.WriteLine(restResponse.Content); 
    }
    

    这将使用返回Task<IRestResponse> 实例的ExecuteTaskAsync 重载。由于它返回Task,因此您可以在此方法上使用await 关键字并返回Task<T> 的返回类型(在本例中为IRestResponse)。

    您可以在这里找到代码:http://dotnetfiddle.net/tDtKbL

    【讨论】:

    • 啊!我想我 :heart: 你!! (而且非常贴切,考虑到今天是情人节)。这将是非常好的添加到 RestSharp wiki。好的,所以..任何机会也有这样的PCL?还是我在碰运气?
    • 我不确定 PCL 版本是否可行,但我会在未来研究它。而且我同意添加到 wiki 会很好,不知道我是否可以编辑它(我不是图书馆的常规维护者)。
    • 也许我们可以让@Haacked 加入会议,也许在 Twitter 上?
    • 如何映射到我的自定义 IRestResponse 实现?
    • 因为我上次使用 Restsharp 大约是在肩垫流行的同时,旋转电话是常态,我们都喜欢通过我们的 Robotics 14.4k 调制解调器访问我们最喜欢的 BBS。回答批准的绿色勾号,我会的。
    【解决方案2】:

    就我而言,我必须调用 Task.Wait() 才能使其正常工作。但是,我使用了不带 CancellationTokenSource 作为参数的版本。

    private static async void Main()
    {
        var client = new RestClient();
        var request = new RestRequest("http://www.google.com");
        Task<IRestResponse> t = client.ExecuteTaskAsync(request);
        t.Wait();
        var restResponse = await t;
        Console.WriteLine(restResponse.Content); // Will output the HTML contents of the requested page
    }
    

    【讨论】:

    • 通过使用Wait,您并没有利用异步代码,您只是在同步运行它。
    • 在我的情况下,调用 ExecuteTaskAsynk(带或不带取消令牌)不会返回并使 IIS 无响应。在找到原因之前,我不得不使用这个 HACK。
    • 如果你等待,为什么不直接使用通话的同步版本...没意义
    • 难道你没有释放线程以在其他地方使用吗?在另一端进行长期运行的操作是有益的,不是吗?
    • 是的,输出来了,答案是否有效,我是否实现了Async操作。
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2019-04-15
    • 2014-06-19
    • 2018-01-14
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多