2016-09-23 5 views
1

背景:無限ループで 'task + number'を出力するタスクでアプリケーションを実行します。私は、アプリケーションを閉じると、それがどのように見えるのか、そのタスクで何が起こっているのかを知りたい。アプリケーションを閉じると何が起こっているのですか?C#

私はその実行タスクを参照するために使用

私の例、:

//delegate to pring text in label 
    private delegate void SetTextToControlDelegate(string text, Control control); 

private void SetTextToControl(string text, Control control) 
{ 
    if (control.InvokeRequired) 
    { 
     SetTextToControlDelegate deleg = 
      new SetTextToControlDelegate(SetTextToControl); 

     this.Invoke(deleg, new object[] { text, control }); 
    } 
    else 
    { 
     control.Text = text; 
    } 
} 

//run a task 
private void Run() 
{ 
    Task.Factory.StartNew(() => 
     { 
      int i = 0; 
      while (true) 
      { 
       Thread.Sleep(1000); 
       i++; 
       string result = "task " + i.ToString(); 
       SetTextToControl(result, label1); 

      } 
     }); 
} 

//button to run task 
private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     Run(); 

    } 
    catch (Exception ex) 
    { 
     SetTextToControl(ex.Message,label1); 
    } 
} 
+0

アプリケーション全体を閉じると、タスクが強制終了されると思います。 – Sebi

+0

タスクが強制終了されました。スレッドはプロセスに属します。 –

答えて

2

あなたのアプリケーションはプロセスです。プロセスはスレッドの親です。プロセスはまた、メモリを管理します。したがって、スレッド(タスク)とそのメモリはプロセスに属します。アプリケーション(プロセス)が終了すると、そのすべての子プロセスが削除されます。タスクが強制終了され、メモリが解放されます。

2

タスクが中止され、アプリケーションが終了しますが。それで全部です。

呼び出しコードには、クリーンアップのためにいくつかの変更が加えられる可能性がありますが、すべてがアプリケーションの終了状態(クラッシュしたかどうか)によって異なります。

TaskThread.Sleepを使用しないでください。タスクが同じスレッド上で実行されるとデッドロックが発生する可能性があります。 await Task.Delayを使用してください。

関連する問題