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;
        }
Пример #2
0
        public static void Write(this EventStoreTransaction tx, IEnumerable <EventData> events)
        {
            var task = tx.WriteAsync(events);

            task.Wait();
        }