我一直在尝试找出代码中发生错误的原因。异常告诉我已经有一个提交正在进行中,但除非对SaveChanges的调用是异步的,否则我不知道这是如何发生的。
我有一个Scheduler类,其中包含多个Task对象。每个Task都有一个BackgroundWorker,在另一个线程中进行处理。然后,我在Task类中为这个BackgroundWorker完成事件设置了一个事件处理程序,并使用以下代码:
现在,在我的理解中,我的主线程已经回来了,因为在后台工作程序中完成了任务。当我有5个任务频繁运行时,我会在SaveChanges上收到异常,说一个提交已经在进行中。我不明白这是怎么回事,因为我没有跨线程共享此上下文。我唯一能想到的是SaveChanges是异步的(不是阻塞调用)。我知道使用using语句和新的context将TaskCompleted代码包装起来可以修复它,但我想知道为什么。为什么它在当前状态下无法正常工作。
我有一个Scheduler类,其中包含多个Task对象。每个Task都有一个BackgroundWorker,在另一个线程中进行处理。然后,我在Task类中为这个BackgroundWorker完成事件设置了一个事件处理程序,并使用以下代码:
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();
}
现在,在我的理解中,我的主线程已经回来了,因为在后台工作程序中完成了任务。当我有5个任务频繁运行时,我会在SaveChanges上收到异常,说一个提交已经在进行中。我不明白这是怎么回事,因为我没有跨线程共享此上下文。我唯一能想到的是SaveChanges是异步的(不是阻塞调用)。我知道使用using语句和新的context将TaskCompleted代码包装起来可以修复它,但我想知道为什么。为什么它在当前状态下无法正常工作。
最后,我正在使用Telerik的OpenAccess ORM。