2011-03-22 16 views
2

私は自分のコードの一部から第三者コードのいくつかのレイヤーを呼び出しています。コール・サーフェスは、私が書いたコードを呼び出して、ある時点で私のコードに戻ってきます。言い換えればこの問題を解決する方法はありますか?

、コードの呼び出しチェーンは次のようになります。

 
My code #1 --> 3rd party code --> My code #2 

残念ながら、私はサードパーティのコードに渡す何もコードの、第2片に与えられていないので、私は最初の部分を結ぶことは何もありませんコードが同じスレッド上で実行されていることを除いて、2番目の部分が一緒になります。

クラスの静的フィールドに[ThreadStatic]を単に使用するだけで解決できるのだろうかと思いましたが、

コードはWebアプリケーションでも実行されるため、私はにはちょうどには静的フィールドを使用できません。オブジェクト(オブジェクト)へのアクセスが必要な値はユーザー/セッションごとに異なります。

ie。私はこのような何かをするでしょう:

internal static class DataHolder 
{ 
    [ThreadStatic] 
    internal static ClassName FieldName; 
} 

他の解決方法はありますか?この質問で述べたように、.NET 4のための

+0

あなたは、デリゲートのいくつかの種類が戻って呼び出されるためにサードパーティのコードを手に持っていると思います。それはあなたにオブジェクトをそれから外す方法を与えるべきです。 –

+0

残念ながら、それは単純ではありません、イベントを添付する唯一の場所は静的イベントです(私を掛けないでください、私はsh **の部分をデザインしませんでした)。サードパーティライブラリ。 –

+0

イベントが静的であるかどうかは関係ありません。作成するデリゲートインスタンスは重要です。 SystemEventsと比較します。 –

答えて

3

これが正常であることを示唆している他の回答とは対照的に、ThreadStaticまたはThreadLocal<T>をASP.NETアプリケーションで使用する場合は非常に注意が必要です。

ASP.NETはスレッドの敏捷性を利用しています。つまり、同じ要求が複数のスレッドによって処理される可能性があります。安全のためにするのではなくThreadStaticまたはThreadLocal<T>を使用するよりも、現在のHttpContextでカプセル化を解除し、あなたの項目を格納する必要があるだろう:

internal static class DataHolder 
{ 
    internal static ClassName PropertyName 
    { 
     get { return (ClassName)System.Web.HttpContext.Current.Items["foo"]; } 
     set { System.Web.HttpContext.Current.Items["foo"] = value; } 
    } 
} 

は、残念ながらこのスレッドアジリティ「機能は、」非常に悪い文書化されています。私は、スレッドスイッチがライフサイクルの特定のポイントでのみ発生する可能性があることを合理的に確信しています。したがって、ライフサイクルでコードが使用される正確な方法と場所によって、 ThreadStaticまたは ThreadLocal<T>で安全です。

私はいくつかのリンクを掘るしようとするでしょう...

+0

これらのポイントはどこにあるのか分かりますか?この場合、コールチェーンは基本的に私がサードパーティのコードを呼び出すことであり、そのコードは静的イベントを介して自分のコードを呼び出します。つまり、ターゲットコールを取得するインスタンスが同じインスタンス(存在する場合)です。サードパーティのコードにはASP.NETとの関係がないため、ASP.NETコードの一部として触れられているASP.NETコードはありません。 –

+0

これは、コードのこの部分をレイヤーにして、非AS.NETでThreadStaticまたはThreadLocalを使用し、ASP.NETで、HttpContext.Currentを使用する必要があります。方法。 –

+0

@Lasse:逸話的な証拠はたくさんあります。単に「スレッド・アジリティasp.net」をGoogleに差し込むだけですが、過去に成功していないと確かな文書を見つけるのに苦労しました。 http://piers7.blogspot.com/2005/11/threadstatic-callcontext-and_02.htmlにそれをよく扱っています。 – LukeH

2

ThreadLocal<T>は:

are static classes shared among different threads in C#

しかし、そのボートに自分自身をあったこと - 私はスタティックルートを下って行くことになりました。それは管理された状態だったので働き、安全だった。

2

はい。 ThreadStaticはそのために動作します。 ThreadLocalを調べると、スレッドの静的変数の操作が簡単になります。

2

[ThreadStatic]は、の場合は、とすれば、サードパーティのコードで呼び出されたスレッドと同じスレッドで常にあなたを呼び戻すことは間違いありません。多くの非同期コールバックモデルでは、これは保証されないことがよくあります。コールバックが同期コールバックとして厳密に定義されている場合は、おそらく大丈夫です。

+0

それは、私はリフレクターを通して検証したので、それは問題ではありません。 –

+0

サードパーティのコードが同じスレッドであなたを呼び出しているからといって、今は必ずしもそうであるとは限りません。実装は、サードパーティコードの将来の改訂で変更される可能性があります。または、テストケースが他のワーカースレッドに「流出」するほどには致命的ではないかもしれません。サードパーティのドキュメントに、同じスレッドでコールバックが呼び出されると記載されている場合は、信頼性が高くなります。経験的な観察は、この規模の建築的意思決定を行う上での厄介なものです。 – dthorpe

+0

現時点では、LukeHのASP.NETに関する注記「スレッドの俊敏性」は、スレッドローカルストレージを使用するためのレンチをスローするようなものです。 – dthorpe