Korzystanie z programu Background Worker - Zaktualizuj pasek postępu przy postępie metody rekurencyjnej

Poniżej znajduje się metoda, którą chcę wysłać do pracownika działającego w tle, ale staram się, jak to zrobić w oparciu o to, w jaki sposób powstała moja metoda. Jak możesz, to nie zwraca niczego, co jest w porządku, ale oczekuje obiektu directoryInfo za każdym razem, gdy zostanie przywrócone.

    private void getSizeForTargetDirectory(DirectoryInfo dtar)
    { 
        // generate a collection of objects. files comes first and then directories.

        foreach (Object item in collection )
        {
            if (item == file)
            {
               track the size of the files as you encounter.
            }
            else if (item == directory)
            {
                // found a new directory, recall the method. !!!
            }
        }
    }

To jest mój pierwszy raz, gdy używam pracownika działającego w tle, więc jestem trochę utknięty, próbowałem zaimplementować coś dzięki pomocy znalezionej tutaj, ale utknąłem, gdy zdałem sobie sprawę, że moja metoda jest rekurencyjna.

Jak wyświetlać postęp podczas zajętej pętli?

Zaimplementowałem metodę obsługi zdarzeń doWork, ale zauważyłem, że muszę jakoś przywołać metodę, jeśli mam więcej plików i folderów do przetworzenia na niższych poziomach.

Mam prostą procedurę obsługi zdarzenia kliknięcia przycisku, która wywołuje moją metodę 'getSizeForTargetDirectory ()', gdy bieżący wybrany węzeł jest katalogiem.

 private void retrieveInfoButton_Click(object sender, EventArgs e)
    {
        // check to see if the path is valid
        // reset the labels and textfields.
        string fullPath = treeDrives.SelectedNode.FullPath;
        string sNodesName = treeDrives.SelectedNode.Text;

        if (directory) // Enter here if its a directory.
        {
            string parentPath = treeDrives.SelectedNode.Parent.FullPath;
            DirectoryInfo[] dirArray = populateFoldersArray(parentPath);

            for (int i = 0; i < dirArray.Length; i++)
            {
                if (dirArray[i].Name == sNodesName)
                {
                    getSizeForTargetDirectory(dirArray[i]);

                    // do work !

Mam nadzieję, że to wyjaśnia, co próbuję zrobić i jak to robię. Pytanie brzmi: w jaki sposób mogę użyć funkcji postępu raportu w klasie pracowników w tle, gdy większość pracy, którą próbuję wysłać, pochodzi z metody rekurencyjnej.

Dzięki wczesnym testom zauważyłem, że moja metoda getSize była niesamowicie wydajna po kilku usprawnieniach i bardzo szybko zgłoszono informacje o rozmiarze dla bieżącego dostarczonego folderu, ale znowu używam dość potężnego komputera dev, więc może to nie być prawdą dla wszystkich użytkowników.

Dzięki za czytanie, mam nadzieję, że ktoś może pomóc !!!

questionAnswers(3)

yourAnswerToTheQuestion