18

QueueUserWorkItem で作成されたスレッドを中止する方法はありますか?

それとも必要ないのでしょうか?メイン アプリケーションが終了するとどうなりますか? そこから作成されたすべてのスレッドは自動的に中止されますか?

4

6 に答える 6

15

それらを中止する必要はありません。アプリケーションが終了すると、.NET は IsBackground = true のスレッドを強制終了します。.NET スレッドプールでは、すべてのスレッドが IsBackground = true に設定されているため、心配する必要はありません。

Thread クラスを新しくしてスレッドを作成している場合は、スレッドを中止するか、IsBackground プロパティを true に設定する必要があります。

于 2008-08-25T20:41:02.233 に答える
10

ただし、これらのスレッドで管理されていないリソースを使用している場合、多くの問題が発生する可能性があります。

それはむしろそれらの使用方法に依存します-これらのアンマネージリソースが適切にラップされていれば、それらを参照したスレッドを強制終了するために使用されたメカニズムに関係なく、ラッパーのファイナライズによって処理されます. また、管理されていないリソースは、アプリが終了するときに OS によって解放されます。

(Windows)アプリケーションは、アプリのシャットダウン時にクリーンアップを試みるのに非常に多くの時間を費やしているという一般的な感覚があります。多くの場合、大量のメモリをページインして、再び破棄できるようにする必要があります(または実行されるページイン コード)。とにかくOSが処理する管理されていないオブジェクトを解放します)。

于 2008-08-28T18:10:40.790 に答える
3

スレッドプールはバックグラウンド スレッドを使用します。したがって、アプリケーションが終了すると、それらはすべて自動的に閉じられます。

スレッドを自分で中止したい場合は、自分でスレッドを管理する (スレッド オブジェクトで Thread.Abort() を呼び出すことができるようにする) か、何らかの形式の通知メカニズムを設定する必要があります。スレッドにそれ自体を中止するように伝えます。

于 2008-08-25T20:44:37.513 に答える
2

はい、そうします。ただし、これらのスレッドで管理されていないリソースを使用している場合、多くの問題が発生する可能性があります。

于 2008-08-25T20:38:49.523 に答える
0

ええ、それらはバックグラウンドですが、ある種の複数のダウンロードなどにThreadPoolを使用するアプリケーションがあり、それらを停止したい場合、どのように停止しますか?私の提案は次のようになります:できるだけ早くスレッドを終了します、f.ex

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

また、stop = trueを設定すると、キュースレッドが処理を終了した後、2番目の(現在キューにある)スレッドが自動的に終了します。

于 2009-05-22T05:37:34.203 に答える
0

Lukas Šalkauskas の回答によると。

ただし、次を使用する必要があります。

volatile bool stop = false;

コンパイラに、この変数が複数のスレッドで使用されていることを伝えます。

于 2009-06-10T14:30:01.890 に答える