如何使用RestSharp和async/await?

115

我正在努力寻找一个现代的异步C#代码示例,该示例使用RestSharp和async以及await。我知道Haack最近进行了更新,但我不知道如何使用新方法。

另外,我该如何提供取消令牌,以便可以取消操作(例如,如果用户对等待感到厌烦并按下应用程序UI中的取消按钮)。

2个回答

227

好的,Haack所指的更新已经是我做的 :) 让我向您展示如何使用它,因为实际上非常简单。以前你有像ExecuteAsyncGet这样的方法,它会返回一个名为RestRequestAsyncHandle的RestSharp自定义类型。这种类型无法像async/await一样等待,因为TaskTask<T>返回类型上工作。我的拉取请求添加了现有异步方法的重载,它们返回Task<T>实例。这些Task<T>重载在其名称中加入了一个附加的"Task"字符串,例如用于ExecuteAsyncGetTask<T>重载称为ExecuteGetTaskAsync<T>。对于每个新的Task<T>重载,都有一个不需要指定CancellationToken的方法和一个需要指定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

啊!我想我爱你了!(这非常贴切,因为今天是情人节)。将此添加到RestSharp维基上会非常好。好的,那么..有没有这个的PCL版本呢?或者我太贪心了? - Pure.Krome
我不确定这个是否有适用于PCL版本,但我会在未来研究它。我同意添加到Wiki会很好,但不知道是否允许我编辑(因为我不是该库的常规维护者)。 - Erik Schierboom
+1. @ErikSchierboom: 我有很多PCL异步编程经验。如果你有任何问题可以私信我(或者在 Stack Overflow 上发布)。 - Stephen Cleary
4
如何将自定义的 IRestResponse 实现映射到我的代码中? - jpgrassi
3
因为我上次使用Restsharp是在肩垫时尚,旋转式电话普遍存在,我们都喜欢通过我们的Robotics 14.4k调制解调器访问我们最喜爱的BBS的时候。 - Pure.Krome
显示剩余9条评论

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
}

10
使用 Wait 方法时,你并没有利用异步代码的优势,而只是以同步方式运行它。 - The Muffin Man
在我的情况下,调用ExecuteTaskAsynk(使用或不使用取消令牌)不会返回并使IIS无响应。在我找到原因之前,我不得不使用这个“HACK”。 - Alex 75
如果你在等待,为什么不使用调用的同步版本呢?这样做没有意义。 - Egli Becerra
2
你不会释放线程让它在其他地方使用吗?在另一端进行长时间运行的操作是有益的,不是吗? - benmccallum
是的,输出已经生成,无论答案是否有效,我是否实现了异步操作。 - Prince Antony G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接