【发布时间】:2014-03-13 19:19:18
【问题描述】:
我正在努力寻找一些将 RestSharp 与 async 和 await 结合使用的异步 C# 代码的现代示例。我知道有been a recent update by Haack,但我不知道如何使用新方法。
另外,我如何提供取消令牌以便取消操作(例如,如果有人厌倦了等待并按下应用 UI 中的取消按钮)。
【问题讨论】:
标签: c# .net asynchronous async-await restsharp
我正在努力寻找一些将 RestSharp 与 async 和 await 结合使用的异步 C# 代码的现代示例。我知道有been a recent update by Haack,但我不知道如何使用新方法。
另外,我如何提供取消令牌以便取消操作(例如,如果有人厌倦了等待并按下应用 UI 中的取消按钮)。
【问题讨论】:
标签: c# .net asynchronous async-await restsharp
嗯,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
【讨论】:
就我而言,我必须调用 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,您并没有利用异步代码,您只是在同步运行它。