2016-08-29 29 views
1

私は非同期コード間で情報を共有するためにCallContext.LogicalGetDataを使用しています。CallContext.LogicalSetDataのスレッドセーフな使用

私は「スレッドセーフ」な方法で呼び出しのこの種類を実行したい:

var val = CallContext.LogicalGetData(key); 
if(val==null) 
{ 
    CallContext.LogicalSetData(key, initialValue); 
} 
return val; 

それを行う方法上の任意のアイデアを?

答えて

1

lockを使用します。

private static readonly object _lock = new object(); 

public static object GetData(string key, object initialValue) 
{ 
    lock(_lock) 
    { 
     object val = CallContext.LogicalGetData(key); 
     if (val == null) 
      CallContext.LogicalSetData(key, initialValue); 
     return val; 
    } 
} 

注:クラスやメソッドが静的である必要はありません。クリティカルセクションにアクセスするときに、すべてのスレッドが同じロックを使用していることを確認してください。

+0

あなたはそうです、文脈ごとにロックは必要ありません、一つのロックで十分です=)ありがとう! – David

+0

パフォーマンス上の理由から、ヌルチェックの後にロックを入れる方が良いと思います。 – David

+0

@David私はそれをしません。変数の読み込みはスレッドセーフでなければなりません。 –

関連する問題