如何将 RestSharp 与 async/await 一起使用
Posted
技术标签:
【中文标题】如何将 RestSharp 与 async/await 一起使用【英文标题】:How to use RestSharp with async/await 【发布时间】:2014-03-13 19:19:18 【问题描述】:我正在努力寻找一些将 RestSharp 与 async
和 await
结合使用的异步 C# 代码的现代示例。我知道有been a recent update by Haack,但我不知道如何使用新方法。
另外,我如何提供取消令牌以便取消操作(例如,如果有人厌倦了等待并按下应用 UI 中的取消按钮)。
【问题讨论】:
【参考方案1】:嗯,Haack 所指的更新是由我制作的 :) 所以让我向您展示如何使用它,因为它实际上非常简单。以前你有像ExecuteAsyncGet
这样的方法,它会返回一个名为RestRequestAsyncHandle
的RestSharp 自定义类型。无法等待此类型,因为 async/await
适用于 Task
和 Task<T>
返回类型。我的拉取请求向返回 Task<T>
实例的现有异步方法添加了重载。这些Task<T>
重载在其名称中添加了一个“任务”字符串,例如ExecuteAsyncGet
的Task<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 的对象数组?