private void SearchWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            var worker = sender as BackgroundWorker;

            var path = e.Argument as string;

            if (string.IsNullOrEmpty(path) || !Directory.Exists(path))
            {
                return;
            }

            SearchWorker.ReportProgress(0, "Enumerating folders...");
            var folders = new ParallelWalk().GetFolders(path);            //SafeWalker.GetFolders(path);

            SearchWorker.ReportProgress(0, string.Format("Processing folders 0/{0}...", folders.Length));

            var   processed      = 0;
            float total          = folders.Length;
            var   statusInterval = folders.Length / 100;

            if (worker.CancellationPending)
            {
                return;
            }

            Parallel.For(0L, folders.Length, i =>
            {
                if (worker.CancellationPending)
                {
                    return;
                }

                var folder = ProcessFolder(folders[(int)i]);
                if (folder.Size > 0)
                {
                    _result.Add(folder);
                }

                Interlocked.Add(ref processed, 1);

                if (statusInterval > 0 && processed % statusInterval == 0)
                {
                    SearchWorker.ReportProgress((int)((processed / total) * 100.0), "Processing folders (" + processed + "/" + total + ")...");
                }
            });
            SearchWorker.ReportProgress((int)((processed / total) * 100.0), "Sorting folders...");
            _result.Sort();
        }
        private void SearchWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            var worker = sender as BackgroundWorker;

            var path = e.Argument as string;
            if (string.IsNullOrEmpty(path) || !Directory.Exists(path))
                return;

            SearchWorker.ReportProgress(0, "Enumerating folders...");
            var folders = new ParallelWalk().GetFolders(path);//SafeWalker.GetFolders(path);

            SearchWorker.ReportProgress(0, string.Format("Processing folders 0/{0}...", folders.Length));

            var processed = 0;
            float total = folders.Length;
            var statusInterval = folders.Length / 100;
            if (worker.CancellationPending)
                return;

            Parallel.For(0L, folders.Length, i =>
            {
                if (worker.CancellationPending)
                    return;

                var folder = ProcessFolder(folders[(int)i]);
                if (folder.Size > 0)
                    _result.Add(folder);

                Interlocked.Add(ref processed, 1);

                if (statusInterval > 0 && processed % statusInterval == 0)
                    SearchWorker.ReportProgress((int)((processed / total) * 100.0), "Processing folders (" + processed + "/" + total + ")...");
            });
            SearchWorker.ReportProgress((int)((processed / total) * 100.0), "Sorting folders...");
            _result.Sort();
        }