Ошибка открытия DataReader с асинхронными вызовами TPL к объекту DAL - PullRequest
1 голос
/ 11 ноября 2011

Я использую TPL для выполнения асинхронных вызовов метода в моем DAL, который извлекает данные из серверной части.Это работает нормально, но иногда возникает исключение EntityCommandExecutionException с

. С этой командой уже существует открытый DataReader, который должен быть закрыт первым.

сообщение.

Очевидно, это вызвано тем, что один поток пытается получить доступ к методу того же экземпляра объекта DAL, который еще используется другим потоком, поэтому я решил эту проблему, создавая экземпляр этого объекта DAL при каждом вызове, и эторешает проблему, но мне интересно, есть ли способ решить эту проблему без необходимости создания экземпляра объекта DAL при каждом вызове?

Ответы [ 3 ]

2 голосов
/ 11 ноября 2011
  1. Дайте каждому потоку экземпляр DAL
  2. Посылка вызовов в поточный DAL (с lock).
1 голос
/ 11 ноября 2011

Я рекомендую вам использовать ThreadLocal (T) , который был представлен в .NET4.0. Хотя вы можете использовать атрибут 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();
}
1 голос
/ 11 ноября 2011

Используйте атрибут ThreadStatic для вашего объекта DAL.

Это позволит избежать необходимости в замках.

...