【问题标题】:disposing realm in xamarin在 xamarin 中处理领域
【发布时间】:2017-04-15 19:38:59
【问题描述】:

我正在使用Xamarin.Forms中的Realm构建移动应用程序,对在xamarin中关闭领域有一些疑问。

以下是更新领域记录的方法

public  void updateData(EventType e)
        {

               Realm realm = Realm.GetInstance();
                 realm.WriteAsync(tempRealm =>
                {

                    tempRealm.Add(e.response, true);
                });

                realm.Dispose();

                MessagingCenter.Send<IMessage, EventType>(this, RestApi.UI_EVENT, e);


        }
  1. 是否每次调用Realm.GetInstance(); 时都需要调用realm.Dispose() ?
  2. WriteAsync 是否负责关闭/处置领域?
  3. 我是否必须使用awaitrealm.WriteAsync 作为它的异步方法。

【问题讨论】:

    标签: c# xamarin realm realm-mobile-platform


    【解决方案1】:

    是否每次调用 Realm.GetInstance 时都需要调用 realm.Dispose()?

    是的。最终,当您不再使用 Realm 实例时,您应该 Dispose。这将释放所有消耗的资源(本机和托管)。

    通常我在应用程序的生命周期内保持一个 UI 线程实例打开(遵循每个平台的应用程序生命周期)。即,我将这个 Realm 实例视为 HttpClient 实例,这是一个应用程序级别的单例,您可以从中打开其他实例。现在,当我通过服务、广播接收器、推送更新等更新数据库时,我会在后台线程上打开和处理实例......

    注意:请记住,如果您在 background 线程上并在该线程上获得同一个 RealmConfigurationBase 的多个 Realm 实例,它们实际上都是同一个 Realm 实例 (Realm.IsSameInstance)。您可以对每个实例调用 Dispose,而不是真正关闭 (Realm.IsClosed) 实例,直到该线程上的所有 实例 都被处理掉。

    WriteAsync 是否负责关闭/处置领域?

    是的。您不想在传递给您的 WriteAsync lamba 函数的 Realm 实例上调用 Dispose

    事实上,如果你这样做了,你会收到一个System.ObjectDisposedException,因为 Realm 已经用事务块包装了那个 Lamba,并且你已经在事务提交或回滚之前处置了这个领域实例。

    我是否必须对 realm.WriteAsync 使用 await 作为它的异步方法。

    请参阅有关 fire&forget 异步方法调用的许多其他 SO,即:Why do I have to use await for a method to run asynchronously. What if I don't want to wait for the method to finish before continuing?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多