10

System.Threading.Thread はファイナライザーを実装していますが、IDisposable を実装していないことに気付きました。推奨される方法は、ファイナライザーが実装されている場合は常に IDisposable を実装することです。Jeffrey Richter、このガイドラインは「非常に重要であり、常に例外なく従うべきである」と書いています。

では、なぜ Thread は IDisposable を実装しないのでしょうか? IDisposable の実装は、スレッドのファイナライズ可能なリソースの決定論的なクリーンアップを可能にする非破壊的な変更になるようです。

関連する質問: スレッドはファイナライズ可能であるため、実行中にスレッドがファイナライズされないように、実行中のスレッドへの参照を保持する必要がありますか?

4

3 に答える 3

8

オブジェクトを破棄するとどうなりThreadますか? この場合の「リソース」には、独自の自然なクリーンアップ、つまりスレッド仕上げがあります。所有権の感覚も失われていることに注意してください...実行中のスレッド内では、いつでも使用できるThread.CurrentThreadため、そのスレッドだけが実際にあらゆる種類の所有権を主張できます。

基本的に、これは少し珍しいケースだと思います。Thread基盤となるリソースには有効期間がありますが、明示的にクリーンアップする必要はありません。

于 2009-11-11T17:49:22.510 に答える
3

それはおそらく、スレッドを破棄できないためです。代わりに、Abort()または alike を使用して死ぬように依頼することができます。

于 2009-11-11T17:50:34.643 に答える
1

これは一種の設計上の問題であるため、.NET のこの側面の構築に関与していない人は推測するしかありません。そうは言っても、このブログ投稿は良い点を示しています。

...少なくともスレッドの現在の実装では、IDisposable を実装しても違いはありません。作成されるスレッドの数を増やしたところ、ある時点でハンドル数が減少したため、それらを閉じるためのメカニズムがいくつかあります

スレッドは自然にクリーンアップするため、通常の意味で管理する必要のあるリソースではありません。

于 2009-11-11T17:51:12.193 に答える