2011-01-26 7 views
1

事前に申し訳ありません - 私はこの問題に取り組むには適切な人ではありませんが、今日は大きな嵐があり、インターン(私)だけが私から来るのに十分なほど狂っていましたチーム。生まれているスレッドを追跡する

簡単なこと - 特定のタスク(ファイルをデシリアライズし、データに基づいて特定の呼び出しを行う)を約11​​5回繰り返した後、いくつかの他のタスクのいずれかがアプリケーションをクラッシュさせるようなしきい値があります。アプリケーションをクラッシュさせる可能性のあるこれらの3つのアクションはすべて、新しいウィンドウの表示を伴います。

私が推測した最良の推測は、私が繰り返しクリックしたときのWindowsタスクマネージャのスレッド数を参考にしています。私たちはスレッドを正しく処分していないということです。数式は、ファイルを読み込むたびにハングする(実際にはもっと多く作成され、ほとんどが消え去る)4つのスレッドが生成されているようです。私はコードをステップ実行し、プロセスが進むにつれスレッドの数を見ることができるかどうかを知りたいです。今はスレッドがいつどこで開始されているのか本当に知りませんが、もし私がしたら、彼らのロジックに従うことができ、彼らが不必要に動作し続けていないことを確認することができます。

ありがとうございます!

+0

コードが停止するとスレッドが消えます。あなたはデバッガでスレッドを追跡することはできますが、それはあなたに役立つとは思わない。 –

+0

あなたがThreadPoolを使用していない理由は何ですか?あなたが言っていることに基づいて、それはこの問題を解消するでしょう。スレッドを再利用する方が、スレッドを常に作成/廃棄するよりも(スレッドが正しく配置されていても)再利用する方が良いです。 –

+0

そして、雪にもかかわらず働くことに+1します:) –

答えて

0

各スレッドで実行されているメソッドのソースにアクセスできる場合は、リストに追加するトレースステートメントを挿入して、デバッガで表示したり、ファイルにダンプしたりすることができますスレッドの実行順序を知ることができます。リストの周りをロックすると、実行の順序が保持されます。

+0

私は別のスレッドで実行されることを知っている各メソッドで私たちの静的Logメソッドへの呼び出しを追加して同様のものを試しましたが、私が知っているものはすべて適切に動作していました。他のプログラマーのコードが作成するタスクやバックグラウンドワーカーは、説明できませんが、どこにいるのかわからないため、ログに記録できませんでした。しかし、ありがとう。 –

1

IntelliTraceを使用して、すべてのアプリケーションスレッドを表示できます。 必要なときはいつでも一時停止するだけで、実行中の各スレッドの呼び出しスタックを確認できます。

1

私は最も可能性の高いことは、あなたが新しいフォームを作成するか、またはバックグラウンドスレッドからフォーム/コントロールにアクセスすることだと思います。

次のイベント

AppDomain.UnhandledExceptionApplication.ThreadExceptionに加入し、問題をデバッグするには、次の

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 

それぞれのEventHandlerにブレークポイントを入れて、イベント引数で例外にスタックトレースのためにロックします。

関連する問題