public Task <EventStoreTransaction> StartTransactionAsync(string stream, int expectedVersion)
        {
            Ensure.NotNullOrEmpty(stream, "stream");

            var source    = new TaskCompletionSource <EventStoreTransaction>();
            var operation = new StartTransactionOperation(source, Guid.NewGuid(), stream, expectedVersion);

            EnqueueOperation(operation);
            return(source.Task);
        }
        public async Task <EventStoreTransaction> StartTransactionAsync(string stream, long expectedVersion, UserCredentials userCredentials = null)
        {
            Ensure.NotNullOrEmpty(stream, "stream");

            var source    = new TaskCompletionSource <EventStoreTransaction>(TaskCreationOptions.RunContinuationsAsynchronously);
            var operation = new StartTransactionOperation(Settings.Log, source, Settings.RequireMaster,
                                                          stream, expectedVersion, this, userCredentials);

            await EnqueueOperation(operation).ConfigureAwait(false);

            return(await source.Task.ConfigureAwait(false));
        }