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.
尝试像这样同步提交:
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)
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |