2016-05-05 3 views
0

単純化すると、GUIを持つメインウィンドウクラスとファイルを操作するワーカークラスの2つのクラスを持つWPFアプリケーションがあります。メインウィンドウで、ユーザーがボタンをクリックすると、ワーカースレッドが開始されます。他のスレッドやクラスでイベントを発生させるためにスレッドに通知する#

作業者を止めるメインウィンドウにボタンを作りたいと思います。ただし、スレッドを強制終了せずに通知すると、そのユーザーはスレッドを中断し、ライターを閉じてファイルを保存できるようになります。

私は長い間stackoverflowを見ていましたが、すべての質問は私の問題に関するものではありません。私はループなどを反復していないことを指摘したいので、フラグを使用することはできません。メインウィンドウからスレッドクラスでイベントを発生させたい。どうやってやるの?

+0

ワーカースレッドとしてどのデータ型を使用していますか。それはバックグラウンドワーカー、非同期タスク、スレッドですか?ほとんどがキャンセルトークンを持っていますが、生のスレッドを使用している場合は、バックグラウンドワーカーに切り替えることをお勧めします。そうしないと、この種のロジックを自分で実装する必要があります。 – xtreampb

答えて

2

メインウィンドウクラスにCancellationTokenSourceを作成します。 CancellationTokenをワーカースレッドに送信します。作業者にトークンを観察するように指示します。 MSDNはキャンセルパターンを参照しており、レビューしています。あなたがループする必要はありません CancellationTokenSource.Cancel()

を呼び出すことによって、UIスレッドからそれを開始するプロセスは、トークンのWaitHanndleに待機することにより、キャンセルされた場合、あなたは観察することができます

キャンセルが必要とされるたびに、:CancellationToken.WaitHandle.WaitOne

WaitOneは、キャンセルが呼び出されるまで無期限に待機します。

+0

ありがとうございました。しかし、私のスレッドに通知するにはどうしたらいいですか?他のスレッドはチェックインしないで 'Cancel()'メソッドを使っていますか? – Niko

+0

私の答えを更新しました。 WaitHandleを使用することができます。 – loopedcode

+0

スレッドは、[IsCancellationRequested'](https://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.iscancellationrequested(v = vs.110).aspx)も呼び出すことができます(WaitHandleを生成する必要はありません)。 'IsCancellationRequested'を定期的にチェックしたくない場合は、[Register'](https://msdn.microsoft.com/en-us/library/dd321635(v=vs.110).aspx)を呼び出すことができます。 WaitHandleよりも軽いです。 – casperOne

関連する問題