Async / प्रतीक्षा के साथ RestSharp का उपयोग कैसे करें


103

मैं के साथ RestSharp का उपयोग करता है कुछ अतुल्यकालिक सी # कोड का एक आधुनिक उदाहरण खोजने के लिए संघर्ष कर रहा हूँ asyncऔर await। मुझे पता है कि हाक द्वारा हाल ही में एक अद्यतन किया गया है लेकिन मुझे नहीं पता कि नए तरीकों का उपयोग कैसे करें।

इसके अलावा, मैं एक कैंसेलेशन टोकन कैसे प्रदान कर सकता हूं ताकि ऑपरेशन रद्द किया जा सके (यदि कोई व्यक्ति प्रतीक्षा करने के लिए बीमार है और ऐप के यूआई में रद्द करें बटन दबाता है)।

जवाबों:


202

खैर, अपडेट हैक का जिक्र मेरे द्वारा किया गया है :) तो चलिए मैं आपको दिखाता हूं कि इसका उपयोग कैसे करना है, क्योंकि यह वास्तव में बहुत सरल है। इससे पहले कि आप की तरह के तरीकों के लिए किया था ExecuteAsyncGetकि एक RestSharp कस्टम नामित प्रकार वापसी होगी RestRequestAsyncHandle। इस प्रकार की प्रतीक्षा नहीं की जा सकती है क्योंकि यह async/awaitकाम करता है Taskऔर Task<T>वापसी के प्रकार। मेरे पुल-अनुरोध ने मौजूदा async विधियों में ओवरलोड्स जोड़े हैं जो Task<T>इंस्टेंस लौटाते हैं । इन Task<T>अधिभारों में उनके नाम के साथ एक जोड़ा "टास्क" स्ट्रिंग है, उदाहरण के लिए Task<T>अधिभार ExecuteAsyncGetको कहा जाता है 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); 
}

यह ExecuteTaskAsyncओवरलोड का उपयोग करेगा जो एक Task<IRestResponse>उदाहरण देता है । जैसा कि यह एक रिटर्न देता है Task, आप awaitइस पद्धति पर कीवर्ड का उपयोग कर सकते हैं और वापस Task<T>लौटे प्रकार (इस मामले में IRestResponse) प्राप्त कर सकते हैं।

आप यहां कोड पा सकते हैं: http://dotnetfiddle.net/tDtKbL


आह! मुझे लगता है कि मैं: दिल: आप !! (और बहुत उपयुक्त, यह वैलेंटाइन्स दिवस को देखते हुए)। यह बहुत अच्छा होगा RestSharp विकी में जोड़ने के लिए। ठीक है, तो .. किसी भी मौका इस का एक पीसीएल है, भी? या मैं अपनी किस्मत को आगे बढ़ा रहा हूं?
शुद्ध.क्रोम

मुझे यकीन नहीं है कि इस का एक पीसीएल संस्करण काम करेगा, लेकिन मैं भविष्य में इस पर गौर करूंगा। और मैं मानता हूं कि विकी से जोड़ना अच्छा होगा, पता नहीं कि मुझे इसे संपादित करने की अनुमति है (मैं पुस्तकालय का नियमित अनुचर नहीं हूं)।
एरिक शियरबॉम

शायद हम ट्विटर पर @Haacked प्राप्त कर सकते हैं, शायद ट्विटर पर?
शुद्ध। क्रोम

3
मैं अपने कस्टम IRestResponse कार्यान्वयन का नक्शा कैसे बना सकता हूँ?
jpgrassi

2
क्योंकि मैंने पिछली बार Restsharp का उपयोग उसी समय किया था जब कंधे के पैड प्रचलन में थे, रोटरी फोन आदर्श थे और हम सभी अपने रोबोटिक्स 14.4k मॉडेम के माध्यम से अपने fav BBS को मारना पसंद करते थे। उत्तर-अनुमोदन की ग्रीन टिक, मैं करूँगा।
शुद्ध.क्रोम

3

मेरे मामले में, मुझे टास्क कहना था। इसके लिए () ठीक से काम करने के लिए। हालाँकि, मैंने उस संस्करण का उपयोग किया है जो पैरामीटर के रूप में रद्द करने के लिए नहीं लेता है।

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 कोड का लाभ नहीं उठा रहे हैं, आप इसे केवल सिंक्रोनाइज़ कर रहे हैं।
मफिन मैन

मेरे मामले में ExecuteTaskAsynk (कैंसिलेशन टोकन के साथ या बिना) कॉल करना वापस नहीं आता है और IIS को गैर जिम्मेदार बनाता है। जब तक मुझे इसका कारण नहीं मिला, मुझे इस HACK का उपयोग करना था।
एलेक्स 75

यदि आप प्रतीक्षा करते हैं कि आप कॉल के सिंक संस्करण का उपयोग क्यों नहीं करते हैं ... व्यर्थ
एगली बेसेरा

1
क्या आप थ्रेड को फ्रीज नहीं कर रहे हैं, हालांकि कहीं और इस्तेमाल किया जा सकता है? दूसरे छोर पर लंबे समय से चल रहे ऑपरेशन पर यह फायदेमंद है, नहीं?
बेन्मेलम

हां, आउटपुट आया, क्या जवाब मान्य है, क्या मैं एसिंक्स ऑपरेशन प्राप्त कर रहा हूं।
प्रिंस एंटनी जी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.