2011-11-10 20 views
1

我正在使用TPL對我的DAL中從後端獲取數據的方法進行異步調用。這工作得很好,但偶爾的EntityCommandExecutionException引發異常,同時打開DataReader錯誤與DPL對象的TPL異步調用

已經有一個用此命令, 必須先關閉相關聯的打開的DataReader。

消息。

顯然,這是由於一個線程試圖訪問另一個線程仍在使用的DAL對象的同一個實例的方法,所以我通過在每次調用時實例化該DAL對象來解決這個問題,這解決了問題,但我想知道是否有辦法解決這個問題,而不必每次打電話時都要實例化DAL對象?

回答

2
  1. 給每個線程DAL實例
  2. 請對DAL調用線程安全的(帶lock)。
+0

我已經在做1,2作品了但是DAL對象有一個小的內存足夠,所以我會堅持我已經做的事情...... –

+0

這不僅僅是DAL。它也緩存記錄...我會支持2) –

1

在您的DAL對象上使用ThreadStatic屬性。

這將避免需要鎖。

+0

這是有希望的,但我仍然得到同樣的錯誤,即使我做了我的兩個實體和我的IList'ThreadStatic'在我在那裏查詢數據庫的同一行(myList中= context.myEnt .... ToList ())...也許我做錯了什麼... –

+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中這一有用的新功能 –