我正在构建一个需要我使用DataContext内部线程的应用程序。我的应用程序不断抛出InvalidOperationException
的相似:Linq to SQL多线程
There is already an open DataReader associated with this Command which must be closed first
ExecuteReader requires an open and available Connection. The connection's current state is connecting
这些例外是间歇的。
这里是我的代码片段:
var repo = new Repository();
var entities = repo.GetAllEntities();
foreach (var entity in entities)
{
ThreadPool.QueueUserWorkItem(
delegate
{
try
{
ProcessEntity(entity);
}
catch (Exception)
{
throw;
}
});
}
我认为它可能有一些与从主线程传递一个实体的线程的错误似乎只要我试图访问扔财产entity
。
任何人有任何想法,为什么发生这种情况,我如何解决它?
更新
这是我决定去:
var events = new Dictionary<int, AutoResetEvent>();
var repo = new Repository();
var entities = repo.GetAllEntities();
foreach (var entity in entities)
{
events.Add(entity.ID, new AutoResetEvent(false));
ThreadPool.QueueUserWorkItem(
delegate
{
var repo = new Repository();
try
{
ProcessHierarchy(repo.GetEntity(entity.ID), ReportRange.Weekly);
}
catch (Exception)
{
throw;
}
finally
{
events[entity.ID].Set();
}
});
}
WaitHandle.WaitAll(events.Values.ToArray());
改进/建议表示欢迎,但这似乎已经完成了帽子戏法。
这本字典有一个名为 “值” 属性。 – Henrik 2009-11-29 19:38:40
@亨利克,谢谢你从未注意到! – James 2009-11-29 20:09:02
+1表示与传入实体相关的建议。解决了我的问题欢呼声。 – 2011-05-26 06:06:10