我一直在试图弄清楚我的代码中是如何发生错误的。异常告诉我提交已经在进行中,但除非调用SaveChanges
是异步的,否则我看不到这是如何发生的。
我有一个Scheduler
包含多个Task
对象的类。每个Task
都有一个BackgroundWorker
在另一个线程中进行处理的。然后,我在类中有一个用于此 BackgroundWorker 完成事件的事件处理程序,Task
代码如下:
private void TaskWorkCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!(e.Result is TaskResult))
throw new ArgumentException("Result must be a TaskResult class.");
TaskComplete((TaskResult)e.Result);
}
还在我这儿?所以我的任务类中有这个事件处理程序,它触发TaskComplete
我在主Scheduler
类中使用以下代码处理的事件:
private void TaskCompleted(object sender, TaskCompletedEvent e)
{
Model.Task scheduledTask = entitySet.Tasks.First(x => x.TaskName == e.ClassName);
TaskLog logMsg = new TaskLog()
{
//stuff here
};
scheduledTask.TaskLogs.Add(logMsg);
entitySet.SaveChanges();
}
现在,据我了解,我回到了我的主线程,因为在我的 backgroundworker 中完成的工作已经完成。当我有 5 个任务非常频繁地运行时,我在 SaveChanges 上收到一个异常,说提交已经在进行中。我不明白这是怎么回事,因为我没有跨线程共享这个上下文。我可以看到这种情况发生的唯一方法是 SaveChanges 是异步的(不是阻塞调用)。我知道用 using 语句将代码包装在 TaskCompleted 中,新的上下文可以解决它,但我想知道为什么。以及为什么不能在当前状态下工作。
最后一件事,我正在使用 Telerik 的 OpenAccess ORM。