2012-12-10 25 views
9

मैं एसिंक का उपयोग कर वेब क्लाइंट का उपयोग करके लिंक कॉल करने के लिए नमूना उदाहरण बना रहा हूं और अब विधि का इंतजार कर रहा हूं, मैं एसिंक कॉल कार्यक्षमता को भी रद्द करना चाहता हूं। लेकिन मैं रद्दीकरण टोकनसोर्स टोकन प्राप्त करने में सक्षम नहीं हूं और इस रद्दीकरण टोकन में DownloadStringTaskAsync संलग्न करता हूं। मेरा कोड निम्नलिखित है क्या कोई मुझे बता सकता है कि इसे कैसे पूरा किया जाए।CanStationTaskAsync विधि को रद्द करने के लिए CancellationTokenSource कैसे संलग्न करें और async कॉल को रद्द करें?

private async void DoWork() 
     { 
      this.Cursor = Cursors.WaitCursor; 
      Write("DoWork started."); 
      cts = new CancellationTokenSource(); 
      WebClient wc = new WebClient(); 
      string result = await wc.DownloadStringTaskAsync(new Uri("http://gyorgybalassy.wordpress.com")); 

      if (result.Length < 100000) 
      { 
       Write("The result is too small, download started from second URL."); 
       result = await wc.DownloadStringTaskAsync(new Uri("https://www.facebook.com/balassy")); 
      } 
      Write("Download completed. Downloaded bytes: " + result.Length.ToString()); 
      Write("DoWork ended."); 
      this.Cursor = Cursors.Default; 
     } 

     private void btnCancel_Click(object sender, EventArgs e) 
     { 
      Write("Cancellation started."); 
      this.cts.Cancel(); 
      Write("Cancellation ended."); 
     } 

जब मेरा रद्द करें बटन cts को कॉल करता है। DownloadStringTaskAsync कॉल रद्द करें रद्द नहीं किया गया है। क्यों रद्द करें बटन Async कॉल को रद्द करने में सक्षम नहीं है?

+0

आप किसी भी तरह से 'CancellationTokeSource' उपयोग नहीं कर रहे हैं, कैसे पता करने के लिए' यह रद्द कर देना चाहिए जब आप इसे नहीं बताया माना WebClient' है कि ? – svick

+0

धन्यवाद आपके उत्तर के लिए svick। लेकिन मैंने टोकन को DownloadStringTaskAsync विधि के पैरामीटर के रूप में पास करने का प्रयास किया लेकिन इस विधि के लिए इसका कोई अधिभार नहीं है जो इसका समर्थन करता है। इसलिए मैं डाउनलोडस्ट्रिंग टास्कएसिंक विधि के साथ रद्दीकरण टोकन का उपयोग कैसे नहीं कर रहा था। क्या आप टीएपी क्षमताओं के साथ सी # में इन सभी नए अपडेट पढ़ने के लिए मुझे कुछ अच्छी किताबें सुझा सकते हैं। –

उत्तर

14

WebClient की एसिंक क्षमताओं का अनुमान .NET 4.5 है, इसलिए यह केवल आंशिक रूप से the Task-based Asynchronous Pattern का समर्थन करता है। इसमें अपनी रद्दीकरण तंत्र शामिल है: the CancelAsync() method, जो नए -TaskAsync विधियों के साथ भी काम करता है। जब एक CancellationToken रोक दी गई है इस विधि कॉल करने के लिए आपको its Register() method उपयोग कर सकते हैं:

cts.Token.Register(wc.CancelAsync); 

एक विकल्प के रूप में, आप नई HttpClient इस्तेमाल कर सकते हैं, के रूप में स्टीफन सुझाव दिया है, जो पूरी तरह से नल का समर्थन करता है CancellationToken रों भी शामिल है। svick के उत्तर के आधार पर

3

WebClient रद्दीकरण का समर्थन नहीं करता है। मैं सुझाव है कि आप इस तरह के HttpClient के रूप में एक नए प्रकार का उपयोग करें:

... 
cts = new CancellationTokenSource(); 
string result; 
using (var client = new HttpClient()) 
using (var response = await client.GetAsync("http://gyorgybalassy.wordpress.com", cts.Token)) 
{ 
    result = await response.Content.ReadAsStringAsync(); 
} 

if (result.Length < 100000) 
... 

GetAsync विधि डिफ़ॉल्ट रूप से पूरा नहीं हुआ है जब तक यह पूरी प्रतिक्रिया पढ़ता है, तो await response.Content.ReadAsStringAsync लाइन वास्तव में तुल्यकालिक पूरा हो जाएगा होगा।

0

एक्सटेंशन तरीके:

public static async Task<string> DownloadStringTaskAsync(this WebClient webClient, string url, CancellationToken cancellationToken) { 
    cancellationToken.Register(webClient.CancelAsync); 
    return await webClient.DownloadStringTaskAsync(url); 
} 

public static async Task<string> DownloadStringTaskAsync(this WebClient webClient, Uri uri, CancellationToken cancellationToken) { 
    cancellationToken.Register(webClient.CancelAsync); 
    return await webClient.DownloadStringTaskAsync(uri); 
} 
संबंधित मुद्दे