2

私は自分のコードの一部からサードパーティのコードのいくつかのレイヤーを介して呼び出しています。呼び出しは、自分が書いたコードを呼び出すことによって、ある時点で自分のコードに戻ってきます。

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

私のコード#1->サードパーティのコード->私のコード#2

残念ながら、サードパーティのコードに渡すものはその2番目のコードに与えられないため、コードが同じスレッドで実行されるという事実を除いて、最初の部分と2番目の部分を結び付けることはできません。

[ThreadStatic]それで、クラスの静的フィールドで単に使用することがこれに対する実行可能な解決策であるかどうか疑問に思いましたか?

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

すなわち。私はこのようなことをします:

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

これに対する他の解決策はありますか?

4

4 に答える 4

3

これで問題ないことを示唆する他の回答とは対照的に、ASP.NET アプリケーションの使用ThreadStaticまたは使用については十分に注意する必要があります。ThreadLocal<T>

ASP.NET はスレッド アジリティを利用します。つまり、同じ要求を複数のスレッドで処理できる可能性があります。安全のために、カプセル化を解除し、 orHttpContextを使用するのではなく、アイテムを current に保存する必要があります。ThreadStaticThreadLocal<T>

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>.

リンク先を探してみます…

于 2011-03-22T16:59:46.110 に答える
2

ThreadLocal<T>この質問で述べた.NET4の場合:

C#の異なるスレッド間で共有される静的クラスです

しかし、自分でそのボートに乗っていたので、静的ルートをたどることになりました。それは扱いやすい状態だったので、それは機能し、安全でした。

于 2011-03-22T16:50:40.047 に答える
2

はい。 ThreadStaticそのために動作します。スレッド静的変数の操作を簡素化するThreadLocalを調べることをお勧めします。

于 2011-03-22T16:53:01.920 に答える
2

はい、[ThreadStatic]は、サードパーティのコードがサードパーティのコードを呼び出したのと同じスレッドで常にコールバックすることを絶対に確信できる場合は、説明したシナリオで機能するはずです。多くの非同期コールバックモデルでは、これは保証されないことがよくあります。コールバックが同期コールバックとして厳密に定義されている場合は、おそらく問題ありません。

于 2011-03-22T16:53:48.313 に答える