スレッド終了コードとは何ですか?


115

デバッグ中の出力ウィンドウのスレッド終了コードとは正確には何ですか?それは私にどんな情報を与えますか?それは何とか便利なのですか、それとも私を困らせるべきではない内部的なものですか?

The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).

可能性のある終了コードとその重要性のある種のリストはあるのでしょうか?

回答:


100

実際に終了コードがスレッドが終了した方法についての指示を与えるために使用されることになっているが、どうやらこのテーマに関する説明の多くをがあるようには思えない、0何かがそれをのdidn意味する傾向がある一方で、それが安全に終了したことを意味する傾向があります期待どおりに終了しません。しかし、この終了コードを完全に見落とすために、自分でコードで設定できます。

詳細情報に役立つと思われる最も近いリンクはこれです

上記のリンクからの引用:

終了方法が何であれ、プロセスまたはスレッドから返す整数は、0〜255(8ビット)の値でなければなりません。ゼロの値は成功を示し、ゼロ以外の値は失敗を示します。整数値を終了コードとして返すことはできますが、整数または整数の最下位バイトのみがプロセスまたはスレッドから終了コードの一部として返されます。上位バイトは、プロセスに関する特別な情報を伝えるためにオペレーティングシステムによって使用されます。終了コードは、プログラムの成功または失敗に応じて他のプログラムを条件付きで実行するバッチ/シェルプログラムで非常に役立ちます。


GetEXitCodeThreadのドキュメントから

重要GetExitCodeThread関数は、スレッドが終了した後にのみ、アプリケーションによって定義された有効なエラーコードを返します。したがって、アプリケーションではSTILL_ACTIVE(259)をエラーコードとして使用しないでください。スレッドがSTIL​​L_ACTIVE(259)をエラーコードとして返す場合、この値をテストするアプリケーションはそれを解釈して、スレッドがまだ実行中であることを意味し、スレッドが終了した後もスレッドの完了をテストし続ける可能性があります。無限ループへの適用。


このすべての私の理解では、独自のアプリケーション内のスレッドを使用している場合、終了コードは、すべてのことはあまり重要ではないということであるため、独自のアプリケーション。これの例外は、相互に依存関係にある複数のスレッドを同時に実行している場合です。外部のソースがこのエラーコードを読み取る必要がある場合は、他のアプリケーションにスレッドのステータスを通知するように設定できます。


1
出力ウィンドウからそれを取り除く方法はありますか?
Arne Evertsson、2014年

26
@ArneEvertsson-ツールにアクセスする場合| オプション... [デバッグ\出力ウィンドウ]領域の下に、[スレッド終了メッセージ](オン|オフ)設定があります。
ジョシュポーリー2014

2
これは、同期アプリケーションのメインスレッド内で非同期メソッドを使用しており、それらが完了するのを待機していないことを意味します。これに対処する最も簡単な方法は、次のサンプルに示すように、別のメソッドによって開始および返されたタスクでWait()を呼び出すことです。asp.net / webRunAsync().Wait();
Bron Davies

1
@BronDaviesスレッドプールスレッドは、Wait()を呼び出した後でもエラーコード259で終了します。これが私のコードです: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }実は、タスクはスレッドプールスレッドによって実行され、スレッドプールのヒューリスティックに基づいて、タスクが完了した後でもスレッドを終了しない場合があります。スレッドは単に、次のタスクが割り当てられるのを待っているスレッドのプールに戻ります。このため、ここでは終了コードSTILL_ACTIVE(259)が非常に直感的に聞こえます。
RBT 2016

リンクの記事は間違っています。スレッドの終了コード(または、プロセスの終了コード)が1バイトのみである必要はありません。
ハリージョンストン

55

Sayseが述べたように、終了コードに259 (0x103)は特別な意味があります。この場合、デバッグされるプロセスはまだ実行中です。

これは、Webサービスのデバッグでよく見ました。これは、各Webサービスの呼び出しを実行した後もスレッドが引き続き実行されるためです(それ以上の呼び出しを待機しているためです)。


7
詳細情報.. 259を参照して終了しますスレッドプールによって所有され、一般的に任意のスレッド:stackoverflow.com/questions/21632584/...
Skrymsli

これが何を意味するのか疑問に思っていました。あなたの答えは、C#コンソールアプリを実行しているときに表示されていたものとまったく同じでした。ありがとう!
kayleeFrye_onDeck 2015年

0

私に起こったことは、私のソリューションに複数のプロジェクトがあることです。プロジェクト1をデバッグするつもりでしたが、プロジェクト2がデフォルトの開始プロジェクトとして設定されました。これを修正するには、プロジェクトを右クリックして[スタートアッププロジェクトとして設定]を選択し、デバッグを実行します。


1
出力ウィンドウにデバッグメッセージが問題として表示されません。私はそれらが何であるかを知りたいだけで、どうやって取り除くかではありませんでした。
Ondrej Janacek 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.