0

ユーザーが私の質問が明確ではないことを指摘した後、「別のスレッド」に関する以下の詳細情報で私の質問を編集しました。

ThreadLocal<T>を使用して異なるクラス間でデータを渡すにはどうすればよいですか?

基本的に、Webservice のクラスからクラスに LogContext 情報を渡す必要がありTraceExtension:SoapExtensionます (TraceExtension は、この WebService が呼び出す別の WebService の要求/応答をログに記録するためのものです)。

この機能は、リクエストを開始したスレッドではなく別のスレッドで実行されるため、ServiceContext:IExtension <InstanceContext> 通常はそのような目的で使用する から取得できません。

この方法を使用して実際に実装していますThread.GetNamedDataSlot()が、パフォーマンス テストでメモリ リークの問題があることがわかりました。(はい、電話しましたがThread.FreeNamedDataSlot()、問題は解決しません)。これにより、MSはhttp://support.microsoft.com/kb/2540745にリークの問題が存在する可能性があると投稿しましたが、現在のリリースの時間枠では、すべての運用サーバーに修正を展開することはできません。推奨される回避策は、System.Threading.ThreadLocal クラスを使用することです。

これまでに見つけたすべてのリソース/例には、同じクラスに ThreadLocal のインスタンスと、Parallelism と PLinq のインスタンスがあります。あるクラスでデータを初期化/設定し、別のクラスから取得する例は非常に役立ちます。にデータを渡す他の方法TraceExtension : SoapExtensionも同様に役立ちます。

スケジュールが少しタイトなため、ご協力をお願いいたします。

詳細を編集してください:

リクエストが送信される Webservice のスレッドは、必要なレスポンスを返しながらバックグラウンド処理を実行する新しい Thread を作成します。新しいスレッドは、他のバックエンド Web サービスへの呼び出しを呼び出します。バックエンド Web サービスへの要求/応答をトレースするための TraceExtension クラスもあります。を使用して、元のスレッドから新しいスレッドのメソッドに LogContext 情報を渡しContextInfo : ISynchronizeInvokeます。

問題は、バックエンド Web サービス呼び出しを呼び出すクラスから LogContext オブジェクトを取得することです (これは新しい Thread で実行され、ServiceContext:IExtension<InstanceContext>LogContext を保持するクライアント要求が来た元の Thread では実行されません)。

4

1 に答える 1

1

ThreadStaticAttributeが必要です。

于 2014-02-06T18:02:31.440 に答える