private Task<object> WriteTransactionData(EventStoreTransaction transaction, int startingVersion, int eventCount, Func<int, EventData> createEvent) { Log.Info("Starting to write {0} events in tran {1}", eventCount, transaction.TransactionId); var resSource = new TaskCompletionSource<object>(); Action<Task> fail = prevTask => { Log.Info("WriteEventsInTransactionalWay for transaction {0} failed.", transaction.TransactionId); resSource.SetException(prevTask.Exception); }; int version = startingVersion; Action<Task> writeTransactionEvent = null; writeTransactionEvent = _ => { if (version == startingVersion + eventCount) { resSource.SetResult(null); return; } version += 1; var writeTask = transaction.WriteAsync(new[] { createEvent(version) }); writeTask.ContinueWith(fail, TaskContinuationOptions.OnlyOnFaulted); writeTask.ContinueWith(writeTransactionEvent, TaskContinuationOptions.OnlyOnRanToCompletion); }; Task.Factory.StartNew(() => writeTransactionEvent(null)); return resSource.Task; }
public static void Write(this EventStoreTransaction tx, IEnumerable <EventData> events) { var task = tx.WriteAsync(events); task.Wait(); }