2016-10-11 9 views
0

winformアプリケーションを使用して新しいスレッドを作成しようとしました。ここに私のサンプルコードです。winformがCで閉じられたときに、デリゲートで新しいスレッドを終了します。

public static bool stop = false; 

private Thread mythread(){ 
    Thread t = new Thread(delegate() { 
     while(!stop){ 
      // Something I want to process 
     } 
    }); 
return t; 
} 

private Button1_click(object sender, EventArgs e){ 
    stop = true; // I know it doesn't work 

    this.Dispose(); 
    this.Close(); 
} 

public Main(){ 
    InitializeComponent(); 

    Thread thread = mythread(); 
    thread.Start(); 
} 

ボタン1をクリックすると、新しいスレッドとwinformは終了する必要がありますが、新しいスレッドはまだ動作しています。新しいスレッドを終了する方法はありますか?

ps:私のコードrefferingをMSDN site exampleに変更しようとしましたが、それはもっと複雑になりました。

+0

一連のwhileループで長いプロセスがある場合は、それを終了するには時間がかかりますことをお勧めします。いくつかのコマンドをすべて停止するかどうかをチェックする方が良いです。あなたはいつもこの目標を達成するためにタスクを使うことができます。タスクはより良いキャンセルメカニズムを持っています。 –

+0

これは、スレッドが決して*停止しないゼロ以外のオッズを正しく実行しているわけではありません。ちょうどこれを正しい方法でやってください。 –

答えて

0

これは、他のスレッドの変数の可視性の問題です...これを試してみてください。

private static int stop = 0; 

private Thread mythread(){ 
    Thread t = new Thread(delegate() { 
     while(Thread.VolatileRead(ref stop) == 0){ 
      // Something I want to process 
     } 
    }); 
return t; 
} 

private Button1_click(object sender, EventArgs e){ 
    Thread.VolatileWrite(ref stop, 1); 

    this.Dispose(); 
    this.Close(); 
} 

public Main(){ 
    InitializeComponent(); 

    Thread thread = mythread(); 
    thread.Start(); 
} 

注:スレッドを中止

  • はお勧めしません。
  • あなたの例では、ストップの揮発性を十分にする必要があります。
  • 提示されたコードは、Thread.VolatileReadThread.VolatileWriteを使用して変数を更新しています。 boolの代わりにintを使用し、volatileキーワードを使用しないと、必要に応じてInterlockedへの移行が容易になります。
  • 私は記事Threading in C# by Joseph Albahari
関連する問題