gpt4 book ai didi

c# - "A commit is already in progress"试图在 Telerik OpenAccess ORM 中保存更改

转载 作者:太空狗 更新时间:2023-10-29 22:01:15 26 4
gpt4 key购买 nike

我一直在努力弄清楚我的代码中是如何发生错误的。异常告诉我提交已经在进行中,但除非对 SaveChanges 的调用是异步的,否则我看不到这是怎么发生的。

我有一个 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 语句和新上下文将代码包装在 TaskCompleted 中会修复它,但我想知道为什么。为什么不能在当前状态下工作。

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

最佳答案

尝试像这样同步提交:

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();
}
}

关于c# - "A commit is already in progress"试图在 Telerik OpenAccess ORM 中保存更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14605727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com