วิธีใช้ RestSharp กับ async / await


103

ฉันพยายามที่จะหาตัวอย่างที่ทันสมัยของบาง # รหัสตรงกัน C ที่ใช้ RestSharp ด้วยและasync awaitฉันรู้ว่ามีการอัปเดตล่าสุดโดย Haackแต่ฉันไม่รู้วิธีใช้วิธีการใหม่นี้

นอกจากนี้ฉันจะให้โทเค็นการยกเลิกได้อย่างไรเพื่อให้สามารถยกเลิกการดำเนินการได้ (เช่นหากมีคนไม่อยากรอและกดปุ่มยกเลิกใน UI ของแอป)

คำตอบ:


202

การอัปเดตที่ Haack อ้างถึงนั้นเป็นของฉัน :) ดังนั้นฉันจะแสดงวิธีการใช้งานให้คุณดูเพราะจริงๆแล้วมันง่ายมาก ก่อนหน้านี้คุณมีวิธีการเช่นExecuteAsyncGetที่จะส่งกลับชนิด RestSharp RestRequestAsyncHandleที่กำหนดเองที่มีชื่อว่า ไม่สามารถรอประเภทนี้เป็นประเภทการasync/awaitทำงานTaskและTask<T>ผลตอบแทน คำขอดึงของฉันเพิ่มโอเวอร์โหลดให้กับเมธอด async ที่มีอยู่ซึ่งส่งคืนTask<T>อินสแตนซ์ เหล่านี้Task<T>เกินได้เพิ่ม "งาน" สตริงเพิ่มชื่อของพวกเขาสำหรับตัวอย่างTask<T>เกินสำหรับการที่เรียกว่าExecuteAsyncGet ExecuteGetTaskAsync<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>อินสแตนซ์ เมื่อส่งคืน a Taskคุณสามารถใช้awaitคำหลักในวิธีนี้และรับTask<T>ประเภทที่ส่งคืนกลับมา (ในกรณีนี้IRestResponse)

คุณสามารถค้นหารหัสได้ที่นี่: http://dotnetfiddle.net/tDtKbL


อา! ฉันคิดว่าฉัน: หัวใจ: เธอ !! (และเหมาะมากเมื่อพิจารณาว่าเป็นวันวาเลนไทน์) นี่จะเป็นการดีมากที่จะเพิ่มไปยัง RestSharp wiki โอเค.. มีโอกาสมีบมจ. ด้วยเหรอ? หรือฉันดันเสี่ยงโชค?
Pure.Krome

ฉันไม่แน่ใจว่าเวอร์ชัน PCL จะใช้ได้หรือไม่ แต่ฉันจะตรวจสอบในอนาคต และฉันยอมรับว่ามันเป็นการดีที่จะเพิ่มลงในวิกิไม่ทราบว่าฉันได้รับอนุญาตให้แก้ไขหรือไม่ (ฉันไม่ใช่ผู้ดูแลห้องสมุดปกติ)
Erik Schierboom

บางทีเราอาจจะได้ @Haacked ในการสนทนาบางทีบน Twitter?
Pure.Krome

3
ฉันจะแมปกับการใช้งาน IRestResponse ที่กำหนดเองได้อย่างไร
jpgrassi

2
เนื่องจากฉันใช้ Restsharp ครั้งล่าสุดในช่วงเวลาเดียวกันกับที่รองไหล่เป็นสมัยนิยมโทรศัพท์แบบหมุนจึงเป็นเรื่องปกติและเราทุกคนชอบที่จะกดปุ่ม BBS ที่ชื่นชอบผ่านโมเด็ม Robotics 14.4k ของเรา ฉันจะทำเครื่องหมายคำตอบ - การอนุมัติสีเขียว
Pure.Krome

3

ในกรณีของฉันฉันต้องเรียก Task.Wait () เพื่อให้ทำงานได้อย่างถูกต้อง อย่างไรก็ตามฉันใช้เวอร์ชันที่ไม่ใช้ Can 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
การใช้Waitคุณไม่ได้ใช้ประโยชน์จากรหัส async คุณแค่เรียกใช้งานพร้อมกัน
The Muffin Man

ในกรณีของฉันที่เรียก ExecuteTaskAsynk (โดยมีหรือไม่มีโทเค็นการยกเลิก) จะไม่ส่งคืนและทำให้ IIS ไม่ตอบสนอง ฉันต้องใช้แฮ็คนี้จนกว่าฉันจะพบสาเหตุ
Alex 75

ถ้าคุณรอทำไมคุณไม่ใช้เวอร์ชันซิงค์ของการโทร ... ไม่มีจุดหมาย
Egli Becerra

1
คุณไม่ได้ปล่อยเธรดเพื่อนำไปใช้ที่อื่นหรือไม่? ในการดำเนินการที่ยาวนานในอีกด้านหนึ่งที่เป็นประโยชน์ไม่?
benmccallum

ใช่เอาต์พุตมาหรือไม่ว่าคำตอบถูกต้องฉันบรรลุการดำเนินการ Async หรือไม่
Prince Antony G
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.