私は過去数ヶ月間スレッドで遊んでいましたが、私の出力は期待通りですが、これは最善の方法ではないと感じています。私はベストプラクティスと一緒に仕事をしている人からまっすぐな答えを得ることができないので、私はあなたに頼むと思った。C#WPF正しく停止する方法をスレッド
質問:私はこの単純なので、私に耐えるようにしようとします。 startとstopボタンがあるフォームがあるとします。開始ボタンが起動し、スレッドを開始するイベント。このスレッドのDoWork
の中には、3つのメソッドが呼び出されます。 Method1()はコンソール "A \ n"に10秒の間隔で10秒間印刷します。 Method2()とMethod3()は全く同じ文字で、異なる休止時間はConsole.WriteLine
です。ここで停止ボタンを押すと、応答が即時になります。私は方法が完了するのを待つ必要はありません。これについてどうすればいいですか?
私は、これは各メソッドに私のBackgroundWorkerを渡すと、私はしかし、法1は、より多くなっていることを想像し、これが私の望ましい結果が得られたようなので、
public void Method1(BackgroundWorker worker)
{
for(int i = 0; i < 10 && !worker.CancellationPending; ++i)
{
Console.WriteLine("A");
for(int j = 0; j < 100 && !worker.CancellationPending; ++i)
{
Thread.Sleep(100);
}
}
}
ようworker.CancellationPendingをチェックしてやっている方法複雑な、それはkeydownとキーを持っている書き込みにDLLを使用しているとしよう。私がスレッドを中断しただけでは、自分自身も望ましくない状態に陥る可能性があります。私は!worker.CancellationPending
で自分のコードを散らしています。実際にはすべてのコードブロック私はCancellationPendingをチェックしています。私は多くの例を見ていて、まるで私のようにスレッドを周回している人はほとんどいません。これに関するベストプラクティスは何ですか?
(それは操作とどのようにそうするようにを中止しても安全だときのみ、あなたが知っているので)あなたは本当に取り消し要求をチェック周りを取得することはできませんが、.NET 4.0を使用している場合、 TPLと新しいキャンセルシステムをチェックしてください。 CancellationTokenの配布を許可することにより、Task(またはBackgroundWorker)からのキャンセルを抽象化します。これにより、キャンセルを実行できるユーザー(CancellationTokenSourceの所有者のみがこれを行うことができます)と、単にキャンセル要求を聞いているユーザーを分けることもできます。 –
"immediate"は相対的です。 「取り消しアクション」メッセージを表示することは、ユーザに同じ期待を満たすかもしれない。 – StingyJack