获得例外:"已经在写入事务中"在Xmrin iOS的领域

时间:2016-09-19 23:22:05

标签: xamarin realm

我在我的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);
}

当显示根视图控制器时,它会访问领域数据,此时是崩溃发生的时间。

关于这里可能发生什么的暗示?

1 个答案:

答案 0 :(得分:1)

我的第一反应是,最可能的是你的Close并不总是被召唤。您的应用是否有任何方式可以转换到其他屏幕,或重新输入这个,而无需调用Close

<强>然而

看看你的堆栈跟踪,令我印象深刻的是你显然是从一个单元格getter调用Write,这是造成崩溃的原因:

MyApp.iOS.CollectionViewSource+<GetCell...

在屏幕打开时,您是否有正在刷新的列表?

<强>更新

从下面的评论中可以注意到一点,这可能让您感到困惑。

在Realm中有两种方式启动写入事务。

BeginTransaction创建并返回一个交易,因此您有机会致电Rollback

Realm.Write( lambda )调用也会创建一个临时写入事务,因此您无法在同一个线程上调用它。

我认为这可能会引起混淆,并会与团队讨论是否应该更新文档,并尝试在这种情况下调用Write时尝试改进异常消息。