如何将 RestSharp 与 async/await 一起使用

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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操作。

以上是关于如何将 RestSharp 与 async/await 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 返回反序列化为从 RestSharp 调用到 API 的对象数组?

如何使用 RestSharp 发布请求

如何将此 .NET RestSharp 代码转换为 Microsoft.Net.Http HttpClient 代码?

await 与 Promise.all 结合使用

如何在 RestSharp 中向请求正文添加文本

如何使用restsharp下载文件