2011-11-10 12 views
1

私はバックエンドからデータをフェッチするDALのメソッドへの非同期呼び出しを行うためにTPLを使用しています。これは正常に動作しますが、時折EntityCommandExecutionException例外がDPLオブジェクトへのTPL非同期呼び出しで開いているDataReaderエラー

でスローされ が最初に閉じる必要があります。このコマンドに関連付けられているオープンDataReaderが既にあります。

メッセージ。

これは明らかに、別のスレッドが使用しているDALオブジェクトの同じインスタンスのメソッドにアクセスしようとしているスレッドが原因で発生します。私は呼び出しが行われるたびにDALオブジェクトをインスタンス化せずにこの問題を解決する方法があるのだろうか?

答えて

2
  1. すべてのスレッドにDALインスタンス
  2. を与えるDALスレッドセーフ(lock付き)への呼び出しを行います。
+0

私はすでに1,2よく、問題のDALオブジェクトには小さなメモリフットリングがあるので、私がすでにやっていることに固執します。 –

+0

それは単なるDALではありません。それはまた、レコードをキャッシュします...私は好きです2) –

1

DALオブジェクトにThreadStatic属性を使用します。

これにより、ロックが不要になります。

+0

これは有望だったが、私はまだ私はデシベル(はmyList = context.myEnt .... ToListメソッドを照会したのと同じラインで私のエンティティと私のIList 'ThreadStatic'の両方を作った後でも、同じエラーを得ていました())...多分私は間違ったことをしていたかもしれません... –

+0

嬉しいことに、私はその属性について学んでいましたが、それはいつか便利になると確信しています... +1 –

1

.NET4.0に導入されたThreadLocal(T)を使用することをお勧めします。 ThreadStatic属性を使用することもできますが、いくつかの制限があります。

  1. ThreadStatic属性はインスタンスフィールドでは機能しません。
  2. フィールドは常にデフォルト値で始まります。

逆に、ThreadLocalを使用すると、静的でないフィールドまたはローカル変数を初期化し、デフォルト以外の値でフィールドを初期化することができます。これは遅延評価されます。

次の例を確認してください。

static void Main(string[] args) 
{ 
    int index = 0; 
    var threadString = new ThreadLocal<string>(() => (index++).ToString()); 
    for (int i = 0; i < 10; i++)new Thread(o => Console.WriteLine(threadString)).Start(); 
    Console.ReadKey(); 
} 
+0

.NET 4のこの便利な新機能へのポインタありがとうございます... +1 –

関連する問題