2011-04-11 14 views
4

VS2008ヘルプファイルを読む私はスレッドを(.netで)終了するきれいな方法は、return文(C#で)を使うか、スレッドがメソッドの最後に到達するかのいずれかであることを理解しました。C#および.netのExitThread(ExitCode)およびGetExitCodeThreadに相当するものは何ですか?

しかし、私はスレッドの終了コードやWin32 APIを使用して取得したものを取得する方法を設定できるメソッドやプロパティが見つかりませんでした。したがって、質問は、私はC#と.netを使ってこれをどうやってやるのでしょうか?

ありがとう、

ジョン

答えて

7

基本的なWin32スレッドプリミティブが公開されない理由は、マネージコードがそれらに依存しないようにするためです。 CLRチームは、スレッドの使用状況を最適化する方法を常に検討しており、管理されていない1:1の管理されていないスレッドマッピング(たとえば、this MSDN pageの「注」を参照してください)に関する保証はありません。とにかくそれをやりたければ、Win32のGetCurrentThread()から管理されていないスレッドハンドルを使用するP/Invokeラッパーを設定するか、独自のカスタムホストでスレッドマッピングプロセスにフックする必要があります。あなたが絶対にスレッド終了コードを使用し、コードを意識して管理されていないものと相互運用する必要がない限り、どちらもお勧めしません。すべての管理を行うことができれば状態情報を密かにするもう1つの方法を見つけ出す(または、Task Parallel Libraryを使用して、裸のスレッドからレベルを抽象化する)。

+0

nitzmahone、返信とリンクをありがとうございます。管理スレッドとO/Sスレッドの間に1対1の対応がないことを考えれば、Pinvoking ExitThreadとGetExitCodeThreadは信頼できる解決策ではないと私は思う。私はそれを設定し、取得する適切なメソッドと一緒に終了コードを追加するスレッドから新しいスレッドクラスを派生することを検討しています。スレッドが終了した後に終了コードの取得が行われるため、終了コードが取得される前にGCによってスレッドオブジェクトが破棄されている可能性があります。それが起こらないことを保証する方法はありますか? – Hex440bx

+0

良い結果が得られるかどうか疑問です。スレッドは封印されており、正当な理由があります。 Win32終了コード・メカニズムを使用しないものを構築することを検討している場合は、論理スレッド・ステータス(前述のTPLなど)を追跡するために既に存在する上位レベルの構成を使用してください。あるいは、管理されたスレッドIDと「終了コード」の静的な辞書と同じように簡単な操作を行うことができます。あなたのプロジェクトの詳細をすべて知っているわけではありませんが、あなたの人生をもっと難しくしようとしているように思えます。 – nitzmahone

+0

本当の問題は、私はちょうど.netとC#を学んでいることです。私はプレーンなWindows APIに精通しています。その結果、私はWinAPIを使って知っていることを.netとC#で同じようにマッチさせようとしています。明らかに、この方法には「問題」がありますが、通常はうまくいきます。この場合、ネットのやり方を理解するためにもっと知る必要があるように思えます。ご協力いただきありがとうございます。ジョン – Hex440bx

関連する問題