我在我的Xamarin应用中使用了Realm,而且我在制作中遇到了这个例外。我从未见过它自己运行应用程序,每天只发生几次。完整的堆栈跟踪是:
System.AggregateException', reason: 'System.AggregateException:
A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread.
---> Realms.RealmInvalidTransactionException: The Realm is already in a write transaction at Realms.NativeException.ThrowIfNecessary (System.Func`2 overrider) <0xab3dfc + 0x00038> in <filename unknown>:0
at Realms.SharedRealmHandle.BeginTransaction () <0xab21c8 + 0x00043> in <filename unknown>:0
at Realms.Transaction..ctor (Realms.SharedRealmHandle sharedRealmHandle) <0xab9ad8 + 0x0002f> in <filename unknown>:0
at Realms.Realm.BeginWrite () <0xab7624 + 0x0003f> in <filename unknown>:0
at Realms.Realm.Write (System.Action action) <0xab7674 + 0x0002b> in <filename unknown>:0
at MyApp.iOS.CollectionViewSource+<GetCell>c__AnonStorey0.<>m__2 (System.Threading.Tasks.Task`1 value) <0x327c34 + 0x001b3> in <filename unknown>:0
at System.Threading.Tasks.ContinuationTaskFromResultTask`1[TAntecedentResult].InnerInvoke () <0x532fa8 + 0x00077> in <filename unknown>:0
at System.Threading.Tasks.Task.Execute () <0x52ed88 + 0x0005b> in <filename unknown>:0
我确定我的应用只能同时打开一个写入事务。我认为唯一可能导致问题的是领域交易没有正确关闭。我的代码是这样的:
// this is called at some point in the app, when entering in a specific view controller
var transaction = realm.BeginWrite ();
关闭此Controller的代码是:
public void Close(bool saveChanges) {
if (saveChanges) {
transaction.Commit ();
transaction.Dispose ();
}
else {
transaction.Rollback ();
transaction.Dispose ();
}
// Ignore the fact that this code can be included in the previous section
// It is just for making clear that after closing the transaction I can make
// a simple change to the objects
if (saveChanges) {
realm.Write(() => {
model.id = 1;
}
}
NavigationController.PopToRootViewController (true);
}
当显示根视图控制器时,它会访问领域数据,此时是崩溃发生的时间。
关于这里可能发生什么的暗示?
答案 0 :(得分:1)
我的第一反应是,最可能的是你的Close
并不总是被召唤。您的应用是否有任何方式可以转换到其他屏幕,或重新输入这个,而无需调用Close
?
<强>然而强>
看看你的堆栈跟踪,令我印象深刻的是你显然是从一个单元格getter调用Write
,这是造成崩溃的原因:
MyApp.iOS.CollectionViewSource+<GetCell...
在屏幕打开时,您是否有正在刷新的列表?
<强>更新强>
从下面的评论中可以注意到一点,这可能让您感到困惑。
在Realm中有两种方式启动写入事务。
BeginTransaction
创建并返回一个交易,因此您有机会致电Rollback
。
Realm.Write( lambda )
调用也会创建一个临时写入事务,因此您无法在同一个线程上调用它。
我认为这可能会引起混淆,并会与团队讨论是否应该更新文档,并尝试在这种情况下调用Write
时尝试改进异常消息。