public void RebuildItemDatabase_RebuildItemDatabase_Success()
        {
            AutoResetEvent progressEvent = new AutoResetEvent(false);
            AutoResetEvent completedEvent = new AutoResetEvent(false);

            ItemsDatabaseBuilder dbBuilder = new ItemsDatabaseBuilder();
            var cancelToken = new CancellationTokenSource();
            int progress = 0;
            int totalRequests = 0;

            var sw = new Stopwatch();
            sw.Start();
            totalRequests = dbBuilder.RebuildItemDatabase(
                CultureInfo.CurrentUICulture,
                () =>
                {
                    progress++;
                    Console.WriteLine("Rebuild at {0} percent", ((double)progress / (double)totalRequests) * 100);
                    progressEvent.Set();
                },
                () =>
                {
                    Console.WriteLine("Rebuild complete");
                    completedEvent.Set();
                },
                cancelToken.Token);

            int i = 0;
            while (progress < totalRequests)
            {
                Assert.IsTrue(progressEvent.WaitOne());
                Assert.AreEqual(++i, progress);
            }

            Assert.IsTrue(completedEvent.WaitOne());
            sw.Stop();

            Console.WriteLine("It took {0} minutes to rebuild the database", sw.Elapsed.TotalMinutes);
        }
        public void RebuildItemDatabase_RebuildItemDatabase_Canceled()
        {
            AutoResetEvent progressEvent = new AutoResetEvent(false);
            AutoResetEvent completedEvent = new AutoResetEvent(false);

            ItemsDatabaseBuilder dbBuilder = new ItemsDatabaseBuilder();
            var cancelToken = new CancellationTokenSource();
            int progress = 0;
            int totalRequests = 0;

            totalRequests = dbBuilder.RebuildItemDatabase(
                CultureInfo.CurrentUICulture,
                () =>
                {
                    progress++;
                    Console.WriteLine("Rebuild at {0} percent", ((double)progress / (double)totalRequests) * 100);
                    progressEvent.Set();
                },
                () =>
                {
                    Console.WriteLine("Rebuild complete");
                    completedEvent.Set();
                },
                cancelToken.Token);

            for (int i = 1; i <= 3; i++)
            {
                Assert.IsTrue(progressEvent.WaitOne(5000));
                Assert.AreEqual(i, progress);
            }

            // Cancel it
            cancelToken.Cancel();
            Assert.IsTrue(progressEvent.WaitOne(5000));
            Assert.IsFalse(progressEvent.WaitOne(5000));
        }