[ThreadStatic]
は属性を使用して定義され、ThreadLocal<T>
は汎用を使用して定義されます。 異なるデザインソリューションが選ばれたのはなぜですか? この場合、汎用オーバー属性を使用するメリットとデメリットは何ですか?ThreadStatic v.s. ThreadLocal <T>:属性よりも一般的ですか?
答えて
コメントに記されているブログ記事は明示的ではありませんが、私は非常に重要であることがわかりました。つまり、[ThreadStatic]
はスレッドごとに自動的に物事を初期化しません。たとえば、あなたがこれを持っていると言う:
[ThreadStatic]
private static int Foo = 42;
これを使用して最初のスレッドがFoo
が42
に初期表示されます。しかし後続のスレッドはそうしません。イニシャライザは、最初のスレッドのみで動作します。したがって、初期化されているかどうかを確認するコードを書く必要があります。
ThreadLocal<T>
は、アイテムに初めてアクセスする前に実行される初期化関数(Reedのブログのように)を提供することで、この問題を解決します。
ThreadLocal<T>
の代わりに[ThreadStatic]
を使用する利点はありません。
おそらく['ThreadLocal
初期化子を使って値を設定するのではなく、代わりに初期化後のある時点で設定する場合は、[ThreadStatic]を使用すると構文的にクリーンです。 – Thought
'[ThreadStatic]'は、コード内のそのフィールドへの既存の参照を変更する必要がないという利点があります。 – NextInLine
ThreadStatic最初のスレッドThreadLocalでのみ初期化各スレッドに対して初期化します。
public static ThreadLocal<int> _threadlocal =
new ThreadLocal<int>(() =>
{
return Thread.CurrentThread.ManagedThreadId;
});
public static void Main()
{
new Thread(() =>
{
for (int x = 0; x < _threadlocal.Value; x++)
{
Console.WriteLine("First Thread: {0}", x);
}
}).Start();
new Thread(() =>
{
for (int x = 0; x < _threadlocal.Value; x++)
{
Console.WriteLine("Second Thread: {0}", x);
}
}).Start();
Console.ReadKey();
}
興味深い例ですが、私はドリフトを取得します。 – Eniola
ThreadStaticの背後にある主要なアイデアは、各スレッドための変数の別のコピーを維持することである。以下は、簡単なデモです。上記のスニペットで
class Program
{
[ThreadStatic]
static int value = 10;
static void Main(string[] args)
{
value = 25;
Task t1 = Task.Run(() =>
{
value++;
Console.WriteLine("T1: " + value);
});
Task t2 = Task.Run(() =>
{
value++;
Console.WriteLine("T2: " + value);
});
Task t3 = Task.Run(() =>
{
value++;
Console.WriteLine("T3: " + value);
});
Console.WriteLine("Main Thread : " + value);
Task.WaitAll(t1, t2, t3);
Console.ReadKey();
}
}
、我々は、メインスレッドを含め、各スレッドのvalue
の別のコピーを持っています。
ので、ThreadStatic変数は、それが作成されたスレッド以外のスレッド上のデフォルト値に初期化されます。
独自の方法で各スレッドの変数を初期化したい場合は、ThreadLocalを使用します。
そして完全な記事は[ここ](http://putridparrot.com/blog/using-threadstatic-and-threadlocal/)で見つけることができます。 – dee
- 1. CallContext.LogicalGetData()vs ThreadLocal/ThreadStatic
- 2. C#4には一般的な属性がありますか?
- 3. コアデータ属性で最も一般的な値を見つける方法
- 4. 検索結果からの一般的な属性
- 5. より一般的なビジターパターン
- 6. すべてのアクティブなThreadLocalのリスト<T>と[ThreadStatic]の参照
- 7. enum属性を取得する一般的な方法(i18n /ローカライゼーションサポートあり)
- 8. Pythonループ:より一般的なものにする
- 9. 一般的な属性の配列を並べ替える
- 10. 最も一般的なタプル
- 11. リンクリストをより一般的にする
- 12. 一般的な属性を持つ別の行から属性を追加します。
- 13. 一般的な形質である一般的な特性を持つ構造
- 14. MySQLで最も一般的なリスト
- 15. これより一般的なparfoldr
- 16. 一般的なPiecewiseのようなものがMathematicaにありますか?
- 17. C++ - SQLとのやり取りに最も一般的なフレームワークですか?
- 18. ThreadStatic属性を使用すると異なる結果
- 19. 一般性に一般性を導入することは可能ですか?
- 20. ポリマー要素のデータセットまたは属性を取得する一般的な方法はありますか?
- 21. パイプラインの一般的なパイプラインの危険性は何ですか?
- 22. 、つまり、一般的に
- 23. なぜThreadlocalデリゲートのthreadstatic属性を初期化すると、最初のスレッドに対してinitilizeされないのですか?
- 24. 一般的なIcollection Of <T>
- 25. 実行時に任意のオブジェクトの属性に一般的にアクセスする
- 26. 最も一般的な/一般的な南米のスペインの文化が
- 27. 世界的な互換性のために最も一般的なロケール
- 28. ドメインイベントASP.NetのThreadStatic属性を使用したコールバック
- 29. コマンドのgitドット表記は、より一般的なものの一部ですか?
- 30. サイズkの最も一般的なサブセット
http://reedcopsey.com/2009/11/12/thread-specific-data-becomes-easier-in-net-4-0-via-threadlocalt/ - 私はこれが何であるかはわかりませんしかし、反射を伴います... –