"提交已在进行中"尝试保存Telerik OpenAccess ORM中的更改

Jus*_*tin 6 .net c# orm multithreading telerik-open-access

我一直试图弄清楚我的代码中是如何发生错误的.异常告诉我提交已在进行中,但除非调用SaveChanges是异步的,否则我看不出这是怎么回事.

我有一个Scheduler包含多个Task对象的类.每个Task都有一个BackgroundWorker在另一个线程中处理.然后,我在Task类中使用以下代码为此BackgroundWorker complete事件提供了一个事件处理程序:

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);
}
Run Code Online (Sandbox Code Playgroud)

还在我这儿?所以我在我的任务类中有这个事件处理程序,它使用以下代码触发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();
}
Run Code Online (Sandbox Code Playgroud)

现在在这一点上,根据我的理解,我回到我的主线程中,因为我的后台工作中完成的工作已经完成.当我经常运行5个任务时,我在SaveChanges上得到一个例外,说提交已在进行中.我不明白这是怎么回事,因为我没有跨线程分享这个上下文.我能看到这种情况的唯一方法是SaveChanges是异步的(不是阻塞调用).我知道使用using语句将TaskCompleted中的代码包装起来,新的上下文会修复它,但我想知道原因.为什么不在目前的状态下工作.

最后一件事,我正在使用Telerik的OpenAccess ORM.

Adi*_*Adi 0

尝试像这样同步提交:

private static object _syncObject = new object();

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);
    lock(_syncObject){
        entitySet.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)