13

バックグラウンド ワーカー スレッドは再利用されますか?

具体的には、バックグラウンド ワーカーの DoWork() メソッド中に名前付きデータ スロット (スレッド ローカル ストレージ) を設定した場合、そのデータ スロットの値は保持され、後で別のスレッドで見つかる可能性がありますか?

私はそうは思わなかったでしょうが、私にはこのバグがあります...

編集:このブログ投稿は、 BackGroundWorkerがThreadPoolを利用することを示唆しています。これは、スレッド再利用されることを意味します。したがって、問題は次のようになります。再利用されたスレッドは、呼び出し間でスレッド ローカル ストレージを保持する可能性がありますか?

4

2 に答える 2

10

スレッド プールがスレッドを再利用する場合、スレッド ローカル ストレージまたは ThreadStaticAttribute 属性でマークされたフィールドのデータは消去されません。したがって、あるメソッドによってスレッド ローカル ストレージに配置されたデータは、同じスレッド プール スレッドによって実行される他のメソッドに公開される可能性があります。ThreadStaticAttribute 属性でマークされたフィールドにアクセスするメソッドは、それを実行するスレッド プール スレッドに応じて異なるデータを検出する可能性があります。

ソース: http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool?redirectedfrom=MSDN&view=netframework-4.8#remarks

于 2010-08-05T10:40:57.567 に答える
-1

MSDN で指定されていない場合は、ソースを (または Reflector を介して) チェックして、これを判断する必要があります。

指定されていない場合、.NET の将来のバージョンで現在の動作が変更されないことに依存することはできません。

編集:スレッドプールを使用しているように見えるため、スレッド再利用されます。

于 2009-02-18T15:34:53.350 に答える