2013-08-21 14 views
6

Bawiłem się z Await/Async i CancellationTokens. Mój kod działa, ale co stanie się z zadaniem, kiedy zostanie anulowane? Czy nadal bierze zasoby, czy jest to śmieci zebrane, czy co?Co dzieje się z zadaniem po anulowaniu?

Oto mój kod:

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(); 
    } 

Odpowiedz

0

Zadanie może być anulowane tylko synchronicznie (co oznacza, że ​​musi zapytać „ja anulowane?”), Więc jest to łatwe zadanie, aby zrobić porządki (na przykład poprzez za pomocą instrukcji using). Wszystkie przydzielone przez niego zasoby są następnie zwalniane przez GC przed lub później (jak zwykle nie wiemy, kiedy GC zadziała, chyba że zrobimy GC.Collect(); GC.WaitForFinalizers();) ...

Powiązane problemy