Aktualizacja interfejsu użytkownika z wątku w tle, który jest wywoływany w pętli w głównym interfejsie użytkownika po zakończeniu wątku

Mam aplikację WinForm, która wywołuje metodę klasy biznesowej, która wykonuje jakieś ciężkie działanie, trwające około 5 sekund dla każdego połączenia. Główna forma wywołuje tę metodę w pętli. Ta pętla może działać od 10 razy do nawet 10 tysięcy razy.

Aplikacja WinForm wysyła parametr do klasy biznesowej i ma obszar do wyświetlania czasu potrzebnego na każde wywołanie metody oraz wartość zwróconą przez metodę. W jaki sposób mogę poinformować moje główne okno i zaktualizować obszar tekstowy w głównej winformie, co metoda zwróciła dla każdego połączenia?

Obecnie dane przychodzą od razu po zakończeniu wszystkich wątków. Czy istnieje sposób na aktualizację interfejsu użytkownika dla wszystkich iteracji pętli po zakończeniu każdego połączenia? Nie przeszkadza mi to, że odbywa się to także sekwencyjnie.

FORMA

    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;

    }

Klasa biznes HeavyDuty

    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;
    }

questionAnswers(1)

yourAnswerToTheQuestion