Cách sử dụng RestSharp với async / await


103

Tôi đang cố gắng tìm một ví dụ hiện đại về một số mã C # không đồng bộ sử dụng RestSharp với asyncawait. Tôi biết có một bản cập nhật gần đây của Haack nhưng tôi không biết cách sử dụng các phương pháp mới.

Ngoài ra, làm cách nào tôi có thể cung cấp mã thông báo hủy để hoạt động có thể bị hủy (giả sử, nếu một người chán chờ đợi và nhấn nút Hủy trong giao diện người dùng của ứng dụng).

Câu trả lời:


202

Chà, bản cập nhật mà Haack đề cập đến là do tôi thực hiện :) Vì vậy, hãy để tôi chỉ cho bạn cách sử dụng nó, vì nó thực sự rất đơn giản. Trước đây bạn có các phương thức như ExecuteAsyncGetvậy sẽ trả về kiểu tùy chỉnh RestSharp có tên RestRequestAsyncHandle. Loại này không thể được chờ đợi như async/awaitcác loại hoạt động TaskTask<T>trả lại. Yêu cầu kéo của tôi đã thêm quá tải vào các phương thức không đồng bộ hiện có trả về các Task<T>phiên bản. Các Task<T>quá tải này có thêm một chuỗi "Tác vụ" được thêm vào tên của chúng, ví dụ: Task<T>quá tải cho ExecuteAsyncGetđược gọi ExecuteGetTaskAsync<T>. Đối với mỗi Task<T>quá tải mới, có một phương thức không yêu cầu phải CancellationTokenchỉ định và có một phương thức thì có.

Vì vậy, bây giờ là một ví dụ thực tế về cách sử dụng nó, cũng sẽ cho thấy cách sử dụng 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); 
}

Điều này sẽ sử dụng ExecuteTaskAsyncquá tải trả về một Task<IRestResponse>thể hiện. Khi nó trả về a Task, bạn có thể sử dụng awaittừ khóa trên phương thức này và được trả về kiểu trả về của Task<T>'(trong trường hợp này IRestResponse).

Bạn có thể tìm thấy mã tại đây: http://dotnetfiddle.net/tDtKbL


AH! Tôi nghĩ tôi: tim: bạn !! (Và rất phù hợp, vì đó là ngày lễ tình nhân). Điều này sẽ RẤT tuyệt vời nếu thêm vào wiki RestSharp. Ok, vậy .. bất kỳ cơ hội nào cũng có một PCL này? Hay tôi đang đẩy vận may của mình?
Pure.Krome

Tôi không chắc liệu phiên bản PCL này có hoạt động hay không, nhưng tôi sẽ xem xét nó trong tương lai. Và tôi đồng ý rằng sẽ rất hay nếu thêm vào wiki, không biết có được phép chỉnh sửa hay không (tôi không phải là người bảo trì thư viện thường xuyên).
Erik Schierboom

Có thể chúng ta có thể đưa @Haacked vào cuộc trò chuyện, có thể trên Twitter?
Pure.Krome

3
Làm cách nào để tôi có thể liên kết triển khai IRestResponse tùy chỉnh của mình?
jpgrassi

2
Bởi vì lần cuối tôi sử dụng Restsharp vào khoảng thời gian mà miếng đệm vai đang thịnh hành, điện thoại quay là tiêu chuẩn và tất cả chúng ta đều thích sử dụng BBS yêu thích của mình thông qua modem Robotics 14.4k. Đánh dấu màu xanh lá cây của sự chấp thuận câu trả lời, tôi sẽ.
Pure.Krome

3

Trong trường hợp của tôi, tôi phải gọi Task.Wait () để nó hoạt động bình thường. Tuy nhiên, tôi đã sử dụng phiên bản không có tham số CancelTokenSource.

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
Bằng cách sử dụng, Waitbạn không tận dụng mã không đồng bộ, bạn chỉ đang chạy nó một cách đồng bộ.
The Muffin Man,

Trong trường hợp của tôi, việc gọi ExecuteTaskAsynk (có hoặc không có mã thông báo hủy) không trả về và khiến IIS trở nên vô trách nhiệm. Tôi đã phải sử dụng HACK này cho đến khi tôi tìm ra nguyên nhân.
Alex 75

nếu bạn chờ đợi tại sao không bạn chỉ cần sử dụng phiên bản đồng bộ của cuộc gọi ... vô nghĩa
Egli Becerra

1
Bạn không giải phóng Chủ đề để được sử dụng ở nơi khác sao? Trên một hoạt động lâu dài ở đầu kia có lợi, phải không?
benmccallum

có, đầu ra đã đến, cho dù câu trả lời là hợp lệ, Tôi có đạt được hoạt động Async không.
Prince Antony G
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.