/// <summary> /// Rollbacks the Ream transaction that is active on this thread. /// </summary> public void RollbackTransaction() { if (!InTransaction) { throw new RealmThreadNotInTransaction("No active transaction on this thread"); } Action <Realms.Realm> action = (r) => { try { realmThread.trans.Rollback(); } finally { realmThread.trans = null; } }; using (var waitEvent = new ManualResetEventSlim(false)) { var workItem = new RealmWork(action, waitEvent); workQueue.Add(workItem); waitEvent.Wait(); } }
/// <summary> /// Invokes a 'Fire and Forget' Action on an independent Realm thread. /// </summary> /// <param name="action">Action.</param> public void BeginInvoke(Action <Realms.Realm> action) { if (action == null) { throw new ArgumentNullException(nameof(action)); } var workItem = new RealmWork(action); workQueue.Add(workItem); }
/// <summary> /// Invoke the specified action on an independent Realm thread. /// </summary> /// <param name="action">Action.</param> public void Invoke(Action <Realms.Realm> action) { if (action == null) { throw new ArgumentNullException(nameof(action)); } using (var waitEvent = new ManualResetEventSlim(false)) { var workItem = new RealmWork(action, waitEvent); workQueue.Add(workItem); waitEvent.Wait(); } }
/// <summary> /// Invoke an Task on an independent Realm thread. /// </summary> /// <returns>Task</returns> /// <param name="func">Func.</param> public Task InvokeAsync(Func <Realms.Realm, Task> func) { if (func == null) { throw new ArgumentNullException(nameof(func)); } using (var wait = new ManualResetEventSlim(false)) { var workItem = new RealmWork(func, wait, null); workQueue.Add(workItem); wait.Wait(); return(Task.FromResult(true)); } }
/// <summary> /// Begin a Realm transaction on this thread. /// </summary> public void BeginTransaction() { if (InTransaction) { throw new RealmThreadInTransaction("Currently this RealmThread is already in a transaction"); } Action <Realms.Realm> action = (r) => { realmThread.trans = r.BeginWrite(); }; using (var waitEvent = new ManualResetEventSlim(false)) { var workItem = new RealmWork(action, waitEvent); workQueue.Add(workItem); waitEvent.Wait(); } }