public async Task TryLockNextInstanceAsync_AnyQueue()
        {
            var taskHubClient = _host.Services.GetService <TaskHubClient>();

            await taskHubClient.PurgeOrchestrationInstanceHistoryAsync(
                DateTime.UtcNow,
                OrchestrationStateTimeRangeFilterType.OrchestrationCreatedTimeFilter);

            for (var i = 1; i <= 4; i++)
            {
                await taskHubClient.CreateOrchestrationInstanceAsync($"o{i}", "", $"i{i}", null);
            }

            var dbContextFactory    = _host.Services.GetService <Func <OrchestrationDbContext> >();
            var dbContextExtensions = _host.Services.GetService <OrchestrationDbContextExtensions>();

            using var dbContextDispenser = new DbContextDispenser(dbContextFactory);

            var lockTimeout = TimeSpan.FromMinutes(1);

            var instance1 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), lockTimeout);

            var instance2 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), lockTimeout);

            var instance3 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), lockTimeout);

            var instance4 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), lockTimeout);

            var instanceNull = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), lockTimeout);

            instance1.Should().NotBeNull();
            instance1.InstanceId.Should().Be("i1");
            instance2.Should().NotBeNull();
            instance2.InstanceId.Should().Be("i2");
            instance3.Should().NotBeNull();
            instance3.InstanceId.Should().Be("i3");
            instance4.Should().NotBeNull();
            instance4.InstanceId.Should().Be("i4");
            instanceNull.Should().BeNull();
        }
        public async Task TryLockNextInstanceAsync_SpecificQueues()
        {
            var taskHubClient = _host.Services.GetService <TaskHubClient>();

            await taskHubClient.PurgeOrchestrationInstanceHistoryAsync(
                DateTime.UtcNow,
                OrchestrationStateTimeRangeFilterType.OrchestrationCreatedTimeFilter);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o1", "", $"i1", null);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o2", "", $"i2", null);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o3", "", $"i3", null);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o1", "", $"i4", null);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o2", "", $"i5", null);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o3", "", $"i6", null);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o1", "", $"i7", null);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o2", "", $"i8", null);

            await taskHubClient.CreateOrchestrationInstanceAsync($"o3", "", $"i9", null);

            var dbContextFactory    = _host.Services.GetService <Func <OrchestrationDbContext> >();
            var dbContextExtensions = _host.Services.GetService <OrchestrationDbContextExtensions>();

            using var dbContextDispenser = new DbContextDispenser(dbContextFactory);

            var lockTimeout = TimeSpan.FromMinutes(1);

            var instance3 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o3" }, lockTimeout);

            var instance2 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o2" }, lockTimeout);

            var instance1 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o1" }, lockTimeout);

            var instance4 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o1" }, lockTimeout);

            var instance5 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o2" }, lockTimeout);

            var instance6 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o3" }, lockTimeout);

            var instance7 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o1", "o2", "o3" }, lockTimeout);

            var instance8 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o1", "o2", "o3" }, lockTimeout);

            var instance9 = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o1", "o2", "o3" }, lockTimeout);

            var instanceNull = await dbContextExtensions.TryLockNextInstanceAsync(dbContextDispenser.Get(), new[] { "o1", "o2", "o3" }, lockTimeout);

            instance1.Should().NotBeNull();
            instance1.InstanceId.Should().Be("i1");
            instance2.Should().NotBeNull();
            instance2.InstanceId.Should().Be("i2");
            instance3.Should().NotBeNull();
            instance3.InstanceId.Should().Be("i3");
            instance4.Should().NotBeNull();
            instance4.InstanceId.Should().Be("i4");
            instance5.Should().NotBeNull();
            instance5.InstanceId.Should().Be("i5");
            instance6.Should().NotBeNull();
            instance6.InstanceId.Should().Be("i6");
            instance7.Should().NotBeNull();
            instance7.InstanceId.Should().Be("i7");
            instance8.Should().NotBeNull();
            instance8.InstanceId.Should().Be("i8");
            instance9.Should().NotBeNull();
            instance9.InstanceId.Should().Be("i9");
            instanceNull.Should().BeNull();
        }