2016-12-07 13 views
2

私はXamarinでレルムを学習しています。レルム-Xamarinでの非同期操作

Threadを使用していくつかのサンプルデータを挿入しようとしています。私は、同じ関数を複数のスレッドで呼び出すまで、何の問題も抱えていません。領域文書にはexecuteTransactionAsyncの中に挿入操作を実行すると書かれていますが、Realm-Xamarinのようなメソッドはありません。

ここにコードがあります。

Thread thread1 = new Thread(() => TestThread.CountTo10("Thread 1")); 
thread1.Start(); 

Thread thread2 = new Thread(() => TestThread.CountTo10("Thread 2")); 
thread2.Start(); 

Threadクラス:

public class TestThread 
{ 
    public static Realm realm; 
    public static void CountTo10(string _threadName) 
    { 
     realm = Realm.GetInstance(); 
     for (int i = 0; i < 5; i++) 
     { 
      realm.Write(() => 
      { 
       RandomNumber random = new RandomNumber(); 
       System.Console.WriteLine("Iteration: " + i.ToString() + " Random No: " + random.number.ToString() + " from " + _threadName); 
       realm.Manage(random); 
      }); 

      Thread.Sleep(500); 
     } 
    } 
} 

レルムオブジェクト:

public class RandomNumber : RealmObject 
{ 
    public int number { get; set; } 

    public RandomNumber() 
    { 
     number = (new Random()).Next(); 
    } 
} 
+0

xamarinドキュメント:https://realm.io/docs/xamarin/latest/ – EpicPandaForce

答えて

2

問題は、あなたのrealm変数がstaticであるということであり、これは最終的に違法なスレッドのアクセスになります。ただ、staticを削除し、あなたが行ってもいいでしょう:

public class TestThread 
{ 
    public void CountTo10(string _threadName) 
    { 
     Realm realm = Realm.GetInstance(); 
     for (int i = 0; i < 5; i++) 
     { 
      realm.Write(() => 
      { 
       RandomNumber random = new RandomNumber(); 
       System.Console.WriteLine("Iteration: " + i.ToString() + " Random No: " + random.number.ToString() + " from " + _threadName); 
       realm.Manage(random); 
      }); 

      Thread.Sleep(500); 
     } 
     // no need to call `Realm.close()` in Realm-Xamarin, that closes ALL instances. 
     // Realm instance auto-closes after this line 
    } 
} 
+0

おかげで、それが働きました。しかし、このコードはスレッドセーフですか?つまり、私は同じレルムオブジェクト(デフォルトのもの)を使って記述します。私は5つの非同期で10000レコードを試しました。スレッドと私はクラッシュを取得しませんでした。しかし、私はそれを確認したい。 –

+0

私は、ドキュメントのようにexecuteTransactionAsyncメソッドの代わりに使う答えを期待していました。 –

+0

レルムはスレッドローカルです。 'Realm.getInstance()'と言うと、デフォルト設定を使って、指定されたスレッドに対して新しいRealmインスタンスを開きます。 '.Write(() - > {...')と言うと、その呼び出しはスレッド間でブロックされているので、特定の時点でスレッドを書くことはできません。 thread-confinedの結果、*スレッドセーフであることに注意してください:他のスレッドから読み込みも変更もできません。 – EpicPandaForce

関連する問題