2017-03-03 20 views
-1

は私がのsomeMethodにとNullReferenceExceptionを取得します。変更するのでとNullReferenceException

get 
{ 
    if (_b == null) 
     _b = new B(); 
} 

:私は、他のスレッドがこのメソッドを呼び出し、Bのヌルになりますが、(私はThreadStaticを理解していれば)他のスレッドが、私はちょうど使用することはできませんB.

にアクセスすることを許されるべきではないと仮定しますBのコンストラクタをpublicに変換し、このように使用すると、Bのインスタンスにいくつかのプロパティ(Cなど)がnullになります。

SomeMethodの内部にロックを設定しようとしましたが、問題を解決しませんでした。

私はクラスBの変更を避けたいと思います。それがないと例外を防ぐことは可能ですか?

+0

あなたはnew演算子を前_bにアクセスするには、各スレッドで呼び出されることが保証されていないので、あなたは基本的にこの不正行為を求めています。 ThreadStaticを実行する通常の方法は、nullの場合、バッキングフィールドを更新する静的プロパティにラップすることです。 – hoodaticus

+0

@RomaDoskoch、私も。 – hoodaticus

+1

代わりに(ThreadLocal)[https://msdn.microsoft.com/en-us/library/dd642243(v = vs.110).aspx]を使用してください。 –

答えて

1

ThreadStaticは、各スレッドに独自のバージョンのフィールドがあることを意味します。アクセスしているスレッドのフィールドを初期化していないため、NullReferenceExceptionsが取得されています。

ドキュメントの先頭から:「静的フィールドの値が各スレッドで一意であることを示します。

https://msdn.microsoft.com/en-us/library/system.threadstaticattribute(v=vs.110).aspx