2013-08-21 7 views
6

मैं Await/Async और रद्दीकरण टोकन के साथ टकरा रहा था। मेरा कोड काम करता है, लेकिन जब इसे रद्द किया जाता है तो कार्य के साथ क्या होता है? क्या यह अभी भी संसाधन ले रहा है या क्या यह कचरा इकट्ठा किया गया है या क्या?जब इसे रद्द किया जाता है तो कार्य में क्या होता है?

यहाँ मेरी कोड है:

private CancellationTokenSource _token = new CancellationTokenSource(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    async Task<String> methodOne() 
    { 
     txtLog.AppendText("Pausing for 10 Seconds \n"); 
     var task = Task.Delay(10000, _token.Token); 
     await task; 
     return "HTML Returned. \n"; 

    } 

    private async void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      var task1 = methodOne(); 
      await task1; 
      txtLog.AppendText(task1.Result + "\n"); 
      txtLog.AppendText("All Done \n"); 
     } 
     catch (OperationCanceledException oce) 
     { 
      txtLog.AppendText("Operation was cancelled"); 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     _token.Cancel(); 
    } 

उत्तर

2

जब कोई कार्य रद्द कर दिया जाता है, तो पूरा (रद्द राज्य में)। यह कचरा संग्रह के संबंध में किसी भी अन्य वस्तु की तरह कार्य करता है: यदि आपके पास इसका कोई संदर्भ नहीं है, तो इसे एकत्रित किया जाएगा।

ध्यान दें कि हालांकि TaskIDisposable, you don't have to dispose it unless you're using the IAsyncResult.AsyncWaitHandle member लागू करता है।

0

एक टास्क केवल तुल्यकालिक रद्द किया जा सकता है (जिसका अर्थ है कि यह पूछना चाहिए कि "मैं रद्द कर दिया है?"), इसलिए काम से उदाहरण के लिए सफाई (करने के लिए यह आसान है using कथन का उपयोग कर)। आवंटित किए गए सभी संसाधनों को जीसी द्वारा पहले या बाद में मुक्त किया जाता है (हमेशा के रूप में, हम नहीं जानते कि जीसी कब कार्य करेगा, जब तक हम GC.Collect(); GC.WaitForFinalizers(); नहीं करते) ...

संबंधित मुद्दे

 संबंधित मुद्दे