コードでエラーがどのように発生しているかを把握しようとしています。例外は、コミットが既に進行中であることを示していますが、への呼び出し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 が非同期 (ブロッキング呼び出しではない) である場合です。TaskCompleted 内のコードを using ステートメントでラップすると、新しいコンテキストで修正されることはわかっていますが、その理由を知りたいです。そして、なぜ現在の状態で機能しないのですか。
最後に、Telerik の OpenAccess ORM を使用しています。