私は、Entity FrameworkコードとSQL Server Compact 4.0を使用して.NET 4 WPFアプリケーションを構築しています。私は、UIをブロック避けるために、バックグラウンドスレッドでDbContext.SaveChanges()
を呼び出すようにしようとしているが、私は時折、次の例外を取得しています: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)
ここSaveChanges()
を呼び出すコードです:
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();
}
});
}
問題を解決しましたか?私にも同様の問題があります。 –
私は私の答えにあるものよりも、より良い理解を得られませんでした。 [AddNewLogEntry](https://github.com/tomhunter-gh/SourceLog/blob/aed3718af18fcff471f04c83f83a0160b97b6829/SourceLog.Model/LogSubscription.cs#L90)メソッドで2つのコレクションに追加されているアイテムがコンテキストに1回ずつ表示されます一度「UIコレクション」に移動します。 –
私は同じ問題を抱えていました。他のプロセスがコンテキストを使用している間にコンテキストにアクセスしようとするバックグラウンド作業者になってしまいました。私は、他のプロセスが終了してそれを解決した後、その呼び出しを移動しました。私はそれらをキューに入れても動作すると思います。私が知っている限り、EFはスレッドを管理する必要があります。バックグラウンドコールを作成するまで、私は決してそのような問題はありませんでした。 – Hannish