2009-07-30 20 views
6

次の利用可能なoppertunityで作業を停止するために、いわゆるワーカースレッドに通知する必要があります。現在、私はこのような何か使用しています:スレッドに停止通知するオプション

public void Run() 
    { 
     while (!StopRequested) 
      DoWork(); 
    } 

を私が持っている懸念はStopRequestedが別のスレッドでTrueに設定されていることです。これは安全ですか?私はブール値をロックできないことを知っています。おそらく、スレッドに停止が必要であることを通知する別の方法があります。たとえば、私はThread.CurrentThread.ThreadState == ThreadState.StopRequestedをチェックすることができますが、スレッド状態をどのように設定できるかは不明です。

+0

ブール値をロックできないのはなぜですか?何らかのロックのために別々の 'Object'を作成することは、一般的には良い方法です。 –

+0

私はboolをロックすることはできません。その値の型は - 私はboolフラグを取得/設定するときにロックする以外の目的ではないいわゆる同期オブジェクトを作成することができます。 boolに安全でなければならない。少なくともReed Copseyは同意する。 –

+0

ええ、ブールの周りのロックは安全でなければならない。協調取消。バックグラウンドワーカーは、実行しているタスクに適切であれば、同様の概念をサポートします。 –

答えて

3

これは、ThreadStateを設定しようとするよりも優れた方法です。 ThreadStateのドキュメントを見ると、StopRequestedは内部使用専用であることが具体的に示されています。

別のスレッドからブール値を設定するのは安全な操作です。この場合、ロックする必要はありません。

+0

私はこのアプローチについて詳しく知りたいと思います。同様の質問、論文、ブログへのリンクがありますか? –

2

イベントオブジェクトを使用する方が良いでしょう。特にあなたのスレッドがブロックされている場合。 (その後、ブロッキングコール内のイベントを待つことができます)

3

BackgroundWorkerを使用して、RunWorkerAsync()を使用し、論理中にケースを処理することができます。

BackgroundWorker worker = new BackgroundWorker(); 
worker.WorkerSupportsCancellation = true; 
worker.DoWork += MyWorkFunction; 
worker.RunWorkerCompleted += MyWorkDoneSuccessfullyFunction; 
worker.RunWorkerAsync(); 

別の解決策は、クラス内の任意の場所に設定可能性があり、あなたが停止する必要があることを知らせるために揮発性のブール値を使用することです。

private volatile bool cancelWork = false; 

public void CancelWork() 
{ 
    cancelWork = true; 
} 
+0

e.Cancelledは、作業員が停止した後でなければなりません。 – SwDevMan81

+0

@ SwDevMan81:あなたは正しい、そのコメントを編集しました。DoWorkの正しい実装については、こちらを参照してください。http://msdn.microsoft.com/en-us/library/system.componentmodel.doworkeventargs.argument.aspx –

2

Thread.Abort()を使用してfinallyブロックのDoWork()メソッドで必要なクリーンアップをラップすることができます。

public void Run(object sender, DoWorkEventArgs e) 
{  
    BackgroundWorker worker = sender as BackgroundWorker; 
    if(worker != null) 
    { 
     while (!worker.CancellationPending) 
     { 
     DoWork(); 
     } 
    } 
} 

上記DoWork次のようになります。

1

私が持っている懸念は StopRequestedが 別のスレッドでTrueに設定されていることです。これは安全ですか?

StopRequestedフィールドにvolatileキーワードが含まれていることを確認してください。理由はthis other answerを参照してください。

関連する問題