使用对DAL对象的TPL异步调用打开DataReader错误

时间:2011-11-10 20:27:59

标签: c# .net linq task-parallel-library

我正在使用TPL对我的DAL中的方法进行异步调用,该方法从后端获取数据。这样可以正常工作但偶尔会抛出EntityCommandExecutionException异常

  

已经有一个与此命令关联的开放DataReader   必须先关闭。

消息。

显然,这是由一个线程试图访问另一个线程仍在使用的DAL对象的同一个实例的方法引起的,所以我通过每次调用时实例化该DAL对象来解决这个问题,这解决了这个问题但是我想知道是否有办法解决这个问题,而不必在每次调用时都实例化DAL对象?

3 个答案:

答案 0 :(得分:2)

  1. 为每个线程提供DAL实例
  2. 调用DAL线程安全(使用lock)。

答案 1 :(得分:1)

在DAL对象上使用ThreadStatic属性。

这样可以避免锁定。

答案 2 :(得分:1)

我建议您使用.NET4.0中引入的ThreadLocal(T)。虽然您可以使用ThreadStatic属性,但存在一些限制。

  1. ThreadStatic属性不适用于实例字段。
  2. 字段始终以默认值开头。
  3. 相反,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();
    }