2016-09-21 12 views
0

私たちのアプリでは、1つの長い(ish)操作、Calculateが完了するまでに約5秒かかります。 This postは私がやっていることと基本的に同じですが、完了したスレッドだけを考慮します。 Calculateを起動するものは、実行中のcalcをすべて終了してから再起動する必要があります。 this oneのような投稿に基づいてと表示され、ThreadPoolはこれを解決できるが、これらの1回限りのケースでは適切な解決策ではない可能性があります。操作を再開するために、途中でスレッドを殺す適切な方法はありますか?

私の質問は、それがまだ進行中なら「古いもの」を適切に処分する方法です。私は現在、このが動作するを思わ...

If CalcThread IsNot Nothing Then 
    CalcThread.Abort() 
    CalcThread = Nothing 
End If 
If CalcThread Is Nothing Then 'one assumes this will always be true 
    CalcThread = New Threading.Thread(AddressOf InternalCalculate) 
    CalcThread.IsBackground = True 
End If 
CalcThread.Start() 

をしていますが、これは正しいソリューションですか?

更新:私のユースケースは、これらのスレッドの唯一の1があることがあり、そして、クリスは下記の注意事項として、中止はすぐにそれをしないかもしれないが、私はの根性を越えSyncLockを使用する必要があることを考えますCalculate

+0

Thread.Abortの邪悪な記事があります。https://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation – FloatingKiwi

+0

私はその記事を読んだことがありますが、それは考慮されていません共有されたデータなどが公開されていないためです。私の本当の疑問は、「ただ、スレッドをNothingに設定して移動できますか? –

答えて

1

スレッドを強制終了しないでください。 Calcメソッドとそれをキャンセルするコードの両方にアクセス可能なスコープ内に揮発性ブール変数を宣言します。変数を定期的にチェックするようにCalcメソッドを変更し、それが真であれば終了します。スレッドを「強制終了」するには、変数を設定するだけです。

+0

VB.netでvolatileを宣言することはできません。同じことをする方法はありますが、やや醜いです。上で述べたように、メインとスレッドの間に共有データはないので、.Abortは問題ではないように見えます。オープンにすることはできません。 –

+0

十分に再:volatile-回避策を使用してください。スレッドの中止は悪いjujuですが、共有されるデータはないかもしれませんが、Calcメソッドの結果はどうなりますか?スレッドを中止すると、出力はハーフコミット状態のままになりますか? –

+0

新しいスレッドが行う最初のことは、その状態を空にすることです。だから、もし私が中止せず、ただそれをNothingに設定すれば、正確に何が起こるでしょうか?走り続けて終了したら消えますか? –

関連する問題