2013-08-21 9 views
6

私はAwait/AsyncとCancellationTokensを使っていました。私のコードは動作しますが、キャンセルされたときにタスクはどうなりますか?それはまだ資源を奪っているのですか、それともガベージコレクションですか?で、たとえば(キャンセルされたときにタスクに何が起こるか

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

答えて

0

タスクは(それが尋ねなければならないことを意味し、「私はキャンセルですか?」)を同期をキャンセルすることができ、そのタスクはクリーンアップを行うことは簡単です:ここでは

は私のコードですusingステートメントを使用して)。割り当てられたすべてのリソースは、GCによって解放されます(いつものように、GCがいつ実行されるかはわかりません)。GC.Collect(); GC.WaitForFinalizers(); ...

関連する問題