ThreadPool.QueueUserWorkItem で作成されたスレッドを中止する方法
-
09-06-2019 - |
質問
QueueUserWorkItem で作成されたスレッドを中止する方法はありますか?
それともその必要はないのでしょうか?メインアプリケーションが終了するとどうなりますか?そこから作成されたすべてのスレッドは自動的に中止されますか?
解決
それらを中止する必要はありません。アプリケーションが終了すると、.NET は IsBackground = true のスレッドをすべて強制終了します。.NET スレッドプールではすべてのスレッドが IsBackground = true に設定されているため、心配する必要はありません。
Thread クラスを新しく作成してスレッドを作成している場合は、スレッドを中止するか、IsBackground プロパティを true に設定する必要があります。
他のヒント
ただし、これらのスレッドで管理されていないリソースを使用している場合、多くのトラブルに陥る可能性があります。
それはむしろ、それらの使用方法に依存します。これらのアンマネージ リソースが適切にラップされていれば、それらを参照していたスレッドを強制終了するために使用されたメカニズムに関係なく、それらはラッパーのファイナライゼーションによって処理されます。 また、アンマネージド リソースは、アプリが終了すると OS によって解放されます。
(Windows) アプリケーションは、アプリのシャットダウン時にクリーンアップするのに時間がかかりすぎるという一般的な印象があります。多くの場合、メモリを再度破棄するためだけに大量のメモリをページインする必要があります (または、走り回るページイン コード)。いずれにしても OS が処理する、マンガ化されていないオブジェクトを解放します)。
スレッドプールはバックグラウンド スレッドを使用します。したがって、アプリケーションが終了すると、これらはすべて自動的に閉じられます。
自分でスレッドを中止したい場合は、スレッドを自分で管理するか (スレッド オブジェクトで Thread.Abort() を呼び出すことができます)、または何らかの形式の通知メカニズムをセットアップする必要があります。スレッド自体を中止するようにスレッドに伝えます。
はい、そうなります。ただし、これらのスレッドで管理対象外のリソースを使用している場合は、多くの問題が発生する可能性があります。
はい、それらはバックグラウンドですが、たとえば、複数のダウンロードなどに ThreadPool を使用するアプリケーションがあり、それらを停止したい場合、どうすれば停止できますか?私の提案は次のようになります。できるだけ早くスレッドを終了してください、f.ex
bool stop = false;
void doDownloadWork(object s)
{
if (!stop)
{
DownloadLink((String)s, location);
}
}
stop = true に設定すると、キュー スレッドの処理が終了した後、2 番目の (現在キューにある) スレッドが自動的に終了します。
ルーカス・シャルカウスカスの答えによると。
ただし、次のものを使用する必要があります。
volatile bool stop = false;
この変数が複数のスレッドで使用されていることをコンパイラに通知します。