我正在使用TPL对我的DAL中的方法进行异步调用,该方法从后端获取数据。这样可以正常工作但偶尔会抛出EntityCommandExecutionException
异常
已经有一个与此命令关联的开放DataReader 必须先关闭。
消息。
显然,这是由一个线程试图访问另一个线程仍在使用的DAL对象的同一个实例的方法引起的,所以我通过每次调用时实例化该DAL对象来解决这个问题,这解决了这个问题但是我想知道是否有办法解决这个问题,而不必在每次调用时都实例化DAL对象?
答案 0 :(得分:2)
lock
)。答案 1 :(得分:1)
在DAL对象上使用ThreadStatic属性。
这样可以避免锁定。
答案 2 :(得分:1)
我建议您使用.NET4.0中引入的ThreadLocal(T)。虽然您可以使用ThreadStatic属性,但存在一些限制。
相反,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();
}