2016-08-31 20 views
0

私はいくつかのスレッドを持っています。すべてが複数のファイルにファイル操作(追加)しています。すべてのスレッドは1つのファイルに書き込み、ConcurrentQueueからデータを取得します。 !queue.emptyという条件のwhileループは、キューが完全に処理されることを保証します。C#スレッドライフサイクルの終了。

ループの終了条件に達すると、たとえば、デリゲートメソッドが "戻る"などのスレッドには何が起こりますか?彼らはプログラムを実行している限り、手動でそれらを殺す必要がある限り、彼らは特定の状態に到達するか、オブジェクトを収集するためにガベージコレクタに通知するか、またはそれらはメモリに生きていますか?

私は現在、スレッドオブジェクトへの参照を保持していません。私の前提がスレッド終了であり、スレッドが収集されているためです。

現在存在しているスレッドの数を表示する方法はありますか?

答えて

1

アプリケーションに

Task Manager => Details => Right Click => Select Column => Threadsを実行しているスレッドの数をチェックし、(それが添付されている場合VSデバッグスレッド)これらは、GCスレッド、ファイナライザスレッドなどが含まれる場合がありますあなたのexe

を含む行を確認するには

スレッドが完了したら、自分自身をkillする必要はありません。ただし、スレッドがIsAliveプロパティを使用して作業を完了したかどうかを確認できます。

+0

@MrinalKambojを使用して、存在しない - あなたのコメントは、俳句のように聞こえると私には意味がありません。あなたは書き直すことができると思いますか? – Enigmativity

+0

@MrinalKamboj私はその声明を今すぐ更新しました。 – user3185569

+0

@ user3185569 - 「スレッドの作業が完了する前にスレッドオブジェクトが収集される可能性があります」というアイデアはどこで得られましたか? – Enigmativity

0

スレッドは、現在の関数(および現在の関数を再帰的に呼び出す呼び出しツリー全体)が終了すると終了します。

など。

void main() 
{ 
    Thread thread = new Thread(f); 
} 

void f() 
{ 
    // allocate suff here 
    g(); 
} 

void g() 
{ 
    // allocate stuff here also 
} 

スレッドスレッド完了F()完了する。 fgに割り当てられたオブジェクトは到達できません(これらの関数のローカルのみである場合)。そして、CLRが望むときにGCedされます。

+0

あなたは正しいことを言っていますが、あなたが混乱していると言ったところです。私は当初、呼び出し元のスレッドが終了するまでスレッドが終了しないことを意味すると考えました。私はそれをはっきりと理解するためにあなたの答えを何度も読まなければならなかった。おそらく、あなたはそれをもっと明確にするために言葉を変えることができますか? – Enigmativity

+0

完了:答えを再編集しました。 –

+0

したがって、オペレーティングシステムのアイドルタスクは、プログラムが終了しないようにします。私は覚えています。 –

-1

Threadクラスを明示的に使用して、一連のconcurrentジョブを実行する傾向があることは明らかです。この特定のコンテキストで:

  • ポスト完了ThreadThread Environment block (TEB), Kernel memory, User memoryを割り当て、ガベージコレクションのために利用可能で、それはそれにもかかわらず、GCが呼び出されたときに、クリーンアップを確実に基底クラスCriticalFinalizerObjectFinalizeメソッドをオーバーライドファイナライズのために2サイクルのGCがクリーンアップされます。 明日のスレッドでは、明示的なスレッドを使用すると、文字通り使用例がなくなり、決して実行されません。あなたは代わりにTaskが計算されているか、Async-AwaitがIOバウンドのような他の形式の並行性を使用しなければなりません。 Taskを用いた場合には

は、スレッドは彼らが戻ってプロセスに読み込まCLRインスタンスごとに作成し、これでスレッドの作成と破棄の世話をしているのと同じプールに行くスレッド・プールおよびポストジョブから使用されていますはるかに良い方法。それはIO completion portsを使用して動作するようAsync-Awaitを用いた場合には

は、何のスレッドは、このようにハードウェア機能

+0

'Thread'は' IDisposable'をどこで実装しましたか? – Enigmativity

+0

'public sealed class Thread:CriticalFinalizerObject、_Thread'これらはどれも' IDisposable'を実装/継承しません。 – Enigmativity

+0

@Enigmativity修正のための私の間違いありがとう、最近スレッドを使用していない、はい、 'Thread'クラスでオーバーライドされる' CriticalFinalizerObject - Finalze'は、必要な処理を行うでしょう –

関連する問題