Tôi đang xây dựng một ứng dụng .NET 4 WPF bằng mã Entity Framework đầu tiên và SQL Server Compact 4.0. Tôi đang cố gắng để gọi DbContext.SaveChanges()
trên một sợi nền để tránh chặn các giao diện người dùng, nhưng tôi thỉnh thoảng nhận được ngoại lệ sau đây: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)
Dưới đây là đoạn code mà các cuộc gọi 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();
}
});
}
Bạn đã từng giải quyết vấn đề chưa? Tôi có một vấn đề tương tự. –
Tôi không thực sự hiểu rõ hơn những gì tôi có trong câu trả lời của mình. Bạn có thể xem mục đang được thêm vào hai bộ sưu tập trong phương pháp [AddNewLogEntry] (https://github.com/tomhunter-gh/SourceLog/blob/aed3718af18fcff471f04c83f83a0160b97b6829/SourceLog.Model/LogSubscription.cs#L90), một lần vào ngữ cảnh thu thập và một lần vào "bộ sưu tập giao diện người dùng". –
Tôi đã có cùng một vấn đề, nó đã kết thúc được một backgroundworker cố gắng truy cập vào bối cảnh trong khi các quá trình khác đang sử dụng nó. Tôi đã chuyển cuộc gọi đó sau khi các quá trình khác kết thúc và giải quyết nó. Tôi đoán rằng xếp hàng họ cũng sẽ làm việc. Theo như tôi biết EF nên quản lý luồng, tôi chưa bao giờ gặp vấn đề như vậy cho đến khi tôi tạo cuộc gọi nền. – Hannish