Ich baue eine .NET 4 WPF-Anwendung zuerst mit Entity Framework-Code und SQL Server Compact 4.0. Ich versuche DbContext.SaveChanges()
auf einem Hintergrund-Thread rufen Sie die Benutzeroberfläche nicht blockiert, aber ich gelegentlich die folgende Ausnahme erhalten:SQL Server Compact Edition 4 - AccessViolationException
System.AccessViolationException occurred
Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Source=System.Data.SqlServerCe
StackTrace:
at System.Data.SqlServerCe.NativeMethodsHelper.OpenStore(IntPtr pOpenInfo, IntPtr pfnOnFlushFailure, IntPtr& pStoreService, IntPtr& pStoreServer, IntPtr& pQpServices, IntPtr& pSeStore, IntPtr& pTx, IntPtr& pQpDatabase, IntPtr& pQpSession, IntPtr& pStoreEvents, IntPtr& pError)
at System.Data.SqlServerCe.NativeMethods.OpenStore(IntPtr pOpenInfo, IntPtr pfnOnFlushFailure, IntPtr& pStoreService, IntPtr& pStoreServer, IntPtr& pQpServices, IntPtr& pSeStore, IntPtr& pTx, IntPtr& pQpDatabase, IntPtr& pQpSession, IntPtr& pStoreEvents, IntPtr& pError)
at System.Data.SqlServerCe.SqlCeConnection.Open(Boolean silent)
at System.Data.SqlServerCe.SqlCeConnection.Open()
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
at System.Data.EntityClient.EntityConnection.Open()
at System.Data.Objects.ObjectContext.EnsureConnection()
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at SourceLog.Model.LogSubscriptionManager.<SaveChanges>b__2() in C:\github.com\tomhunter-gh\SourceLog\SourceLog.Model\LogSubscriptionManager.cs:line 51
InnerException: (null)
Hier ist der Code, der SaveChanges()
ruft:
internal static readonly object DbSaveLockObject = new object();
public static void SaveChanges()
{
Task.Factory.StartNew(() =>
{
lock (DbSaveLockObject)
{
Debug.WriteLine(DateTime.Now + ": SaveChanges in lock");
Db.SaveChanges();
}
});
}
Haben Sie das Problem jemals gelöst? Ich habe ein ähnliches Problem. –
Ich habe nicht wirklich ein besseres Verständnis als das, was ich in meiner Antwort habe. Sie können das Element, das zwei Sammlungen in der Methode [AddNewLogEntry] (https://github.com/tomhunter-gh/SourceLog/blob/aed3718af18fcff471f04c83f83a0160b97b6829/SourceLog.Model/LogSubscription.cs#L90) hinzugefügt wird, einmal im Kontext sehen Sammlung und einmal in die "UI-Sammlung". –
Ich hatte das gleiche Problem, es endete damit, dass ich als Hintergrundarbeiter versuchte, auf den Kontext zuzugreifen, während andere Prozesse ihn nutzten. Ich habe diesen Anruf verschoben, nachdem die anderen Prozesse beendet waren und das es gelöst hat. Ich nehme an, dass es auch funktionieren würde, sie in die Warteschlange zu stellen. Soweit ich weiß, sollte EF das Threading verwalten, ich hatte nie ein solches Problem, bis ich den Hintergrundanruf erstellt habe. – Hannish