2009-08-19 8 views
1

スレッドを使用して、「スケジュールされたタスク」(コンソールアプリケーション)の一部のタスクを非同期に処理するVB.NETアプリケーションがあります。VB.NETのDebug.Writelineはスレッドの実行を停止しますか?

我々はそうのように、一度に10個のスレッドを実行するには、このアプリケーションを制限している:

(擬似コード) - 10件のスレッド の一般的なリストを作成する - 各1 についてthreadprocをオフスポーン - ですか各スレッドが完了するまでに最長の実行を待機するステートメント。thread.join

threadprocによって呼び出されたコードに "Debug.Writeline"または "Trace.Traceinformation"ステートメントが含まれていると、スレッドがハングすることがあります。 Debug - Windows - Threadsウィンドウにそのスレッドが表示され、それに切り替えることができますが、Debug.Writelineステートメントを強調表示し、それを超えてしまうことはありません。

スレッドセーフではないDebugステートメントまたはTraceステートメントには特別なものがありますか?

なぜこれが問題になるのですか?デバッグステートメントをにしておくと、スレッドは決して完了しません。デバッグステートメントを出すと、スレッドは5秒以内に完了します。

+0

ハングアップを引き起こすコードを教えてください。デバッグクラスとトレースクラスはスレッドセーフなので、これはかなり奇妙です。 –

答えて

0

Debug.WriteLineを妨害している可能性のあるトレースリスナーがある可能性があります。

3

はい、いいえ。

内部的にDebug.WriteLineは、TraceInternal.WriteLineを呼び出して終了します。この特定の関数は、スレッドの実行を明示的に停止しませんが、メソッドの実行中にプロセスのグローバルロックを取得します。このロックは、トレースリスナのリストを保護し、WriteLineコマンドの処理をシリアライズします。

2つのスレッドが同時にこのWriteLineステートメントにヒットし、短期間に1つのスレッドが一時停止する可能性があります。また、カスタムトレースリスナが、非常に長い時間稼働しているか、またはブロックされているオペレーションを実行して、他のすべてのスレッドを目立つように凍結させることも可能です。

Visual Studioを使用して、この機能で現在破損しているスレッドを確認してください。それがあなたにこのプロセスを支えているものの手がかりを与えるかどうかを見てください。

0

このアプリケーションにはカスタムトレースリスナーがあります。私がそれをコメントアウトすると、私のロック問題は解決されました。さて、元の開発者を追跡して、このカスタムリスナーで何をしているのかを調べることができたら...

関連する問題