Verwenden eines Hintergrund-Workers - Aktualisieren Sie eine Fortschrittsleiste über den Fortschritt einer rekursiven Methode

Nachstehend finden Sie eine Methode, die ich an einen Hintergrund-Worker weiterleiten möchte, aber ich habe Schwierigkeiten, wie ich das tun soll, basierend auf der Erstellung meiner Methode. Wie Sie sehen können, gibt es nichts zurück, was in Ordnung ist, erwartet jedoch bei jedem Abruf ein directoryInfo-Objekt.

    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. !!!
            }
        }
    }

Dies ist das erste Mal, dass ich einen Hintergrund-Worker benutze, also bin ich ein bisschen festgefahren. Ich habe versucht, etwas zu implementieren, dank der Hilfe, die hier zu finden ist. Als mir jedoch klar wurde, dass meine Methode rekursiv war, blieb ich hängen.

Wie zeige ich den Fortschritt während einer Besetztschleife an?

Ich habe eine doWork-Ereignishandlermethode implementiert, aber festgestellt, dass ich die Methode irgendwie zurückrufen muss, wenn ich mehr Dateien und Ordner auf niedrigeren Unterebenen verarbeiten muss.

Ich habe eine einfache Ereignisbehandlungsroutine für das Klicken auf eine Schaltfläche, die meine Methode 'getSizeForTargetDirectory ()' aufruft, wenn der aktuell ausgewählte Knoten ein Verzeichnis ist.

 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 !

Hoffentlich erklärt das, was ich versuche und wie ich es tue. Die Frage ist, wie ich die Berichtsfortschrittsfunktion der Hintergrundarbeiterklasse verwenden kann, wenn der Großteil der Arbeit, die ich zu versenden versuche, von einer rekursiven Methode stammt.

Durch frühe Tests habe ich festgestellt, dass meine getSize-Methode nach ein paar Optimierungen unglaublich effizient war und Größeninformationen für den aktuell gelieferten Ordner sehr schnell gemeldet hat, aber dann benutze ich wieder einen ziemlich leistungsfähigen Entwicklungscomputer, so dass dies möglicherweise nicht für alle Benutzer zutrifft.

Danke fürs Lesen, hoffe, jemand kann helfen !!!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage