QueueUserWorkItem で作成されたスレッドを中止する方法はありますか?
それとも必要ないのでしょうか?メイン アプリケーションが終了するとどうなりますか? そこから作成されたすべてのスレッドは自動的に中止されますか?
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番目の(現在キューにある)スレッドが自動的に終了します。
Lukas Šalkauskas の回答によると。
ただし、次を使用する必要があります。
volatile bool stop = false;
コンパイラに、この変数が複数のスレッドで使用されていることを伝えます。