Aktualisieren der Benutzeroberfläche von einem Hintergrundthread, der in einer Schleife in der Hauptbenutzeroberfläche aufgerufen wird, wenn der Thread beendet ist

Ich habe eine WinForms-Anwendung, die eine Business-Class-Methode aufruft, die für jeden Aufruf eine Hochleistungsaktion ausführt, die etwa 5 Sekunden dauert. Das Hauptformular ruft diese Methode in einer Schleife auf. Diese Schleife kann 10-mal bis zu zehntausend-mal ausgeführt werden.

Die WinForms-Anwendung sendet einen Parameter an die Geschäftsklasse und verfügt über einen Bereich, in dem die für jeden Methodenaufruf benötigte Zeit und der von der Methode zurückgegebene Wert angezeigt werden. Wie informiere ich mein Hauptfenster und aktualisiere einen Textbereich in der Haupt-Winform mit dem, was die Methode für jeden Aufruf zurückgegeben hat?

Momentan kommen die Daten auf einmal, nachdem alle Threads beendet sind. Gibt es eine Möglichkeit, die Benutzeroberfläche für alle Iterationen der Schleife zu aktualisieren, sobald jeder Aufruf abgeschlossen ist? Es macht mir nichts aus, wenn es auch sequentiell gemacht wird.

Die Form

    HeavyDutyClass hd;
    public Form1()
    {
        InitializeComponent();
        hd = new HeavyDutyClass();
    }


    //BUTTON CLICK
    private void Start_Click(object sender, EventArgs e)
    {

        int filecount = 5000;  //BAD - opening 5000 threads! Any other approach?
        hd.FileProcessed += new EventHandler(hd_FileProcessed);


        var threads = new Thread[filecount];

        for (int i = 0; i < filecount; i++)
        {
            threads[i] = new Thread(() => { hd.LongRunningMethod(); });
            threads[i].Start();   
        }

    }

    //BUSINESS CLASS EVENT THAT FIRES WHEN BUSINESS METHOD COMPELTES
    void hd_FileProcessed(object sender, EventArgs e)
    {

        if (dgv.InvokeRequired)
        {
            dgv.Invoke((MethodInvoker)delegate { UpdateGrid(); });

        }
    }

    private void UpdateGrid()
    {
        dgv.Rows.Add(1);
        int i = dgv.Rows.Count;
        dgv.Rows [ i-1].Selected = true;
        dgv.FirstDisplayedScrollingRowIndex = i - 1;

    }

Die Business-HeavyDuty-Klasse

    public event EventHandler FileProcessed;

    public HeavyDutyClass()
    {
    }

    protected virtual void OnMyEvent(EventArgs e)
    {
        if (FileProcessed != null)
        {
            FileProcessed(this, e);
        }
    }

    public bool LongRunningMethod()
    {
        for (double i = 0; i < 199990000; i++)
        {
            //time consuming loop
        }
        OnMyEvent(EventArgs.Empty);
        return true;
    }

Antworten auf die Frage(1)

Ihre Antwort auf die Frage