如何在异步/等待中使用RestSharp


103

我正在努力寻找一些使用RestSharp和async和的异步C#代码的现代示例await。我知道Haack最近有更新,但是我不知道如何使用新方法。

此外,我如何提供取消令牌,以便可以取消操作(例如,如果某人厌倦了等待,并按了应用程序UI中的“取消”按钮)。

Answers:


202

好吧,Haack所指的更新是我做的:)所以,让我向您展示如何使用它,因为它实际上非常简单。以前,您有类似的方法ExecuteAsyncGet将返回名为的RestSharp自定义类型RestRequestAsyncHandle。不能等待此类型的async/await工作TaskTask<T>返回类型。我的pull-request向返回Task<T>实例的现有异步方法添加了重载。这些Task<T>重载的名称中添加了一个添加的“任务”字符串,例如,名为的Task<T>重载。对于每个新的重载,有一种方法不需要指定,而有一种方法需要指定。ExecuteAsyncGetExecuteGetTaskAsync<T>Task<T>CancellationToken

现在来看一个有关如何使用它的实际示例,该示例还将显示如何使用a 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); 
}

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

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


啊!我想我:心:你!(非常贴切,考虑到情人节)。添加到RestSharp Wiki非常好。好的,所以..有可能有这个的PCL吗?还是我在运气?
Pure.Krome 2014年

我不确定是否可以使用PCL版本,但将来会进行研究。而且我同意将其添加到Wiki会很好,不知道是否允许我对其进行编辑(我不是该库的定期维护者)。
Erik Schierboom 2014年

也许我们可以将@Haacked加入到convo中,也许可以在Twitter上?
Pure.Krome 2014年

3
如何映射到自定义IRestResponse实现?
jpgrassi

2
因为我上次使用Restsharp的时机是在肩垫流行时,所以旋转电话已成为常态,我们大家都喜欢通过Robotics 14.4k调制解调器建立我们最喜欢的BBS。我会答应批准的绿色勾号。
Pure.Krome

3

就我而言,我必须调用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
}

9
通过使用Wait您没有利用异步代码,您只是在同步运行它。
松饼人

就我而言,调用ExecuteTaskAsynk(带有或不带有取消令牌)不会返回并使IIS无响应。在找到原因之前,我不得不使用此HACK。
亚历75 75

如果您等待,为什么不使用通话的同步版本……毫无意义
Egli Becerra

1
您是否不释放线程以在其他地方使用?在另一端进行长时间运行是有益的,不是吗?
benmccallum

是的,输出来了,答案是否有效,我是否实现了异步操作。
安东尼王子G
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.