[C#] Watki i wywolanie zwrotne o zakonczenui

0
Jako, że jest to mój pierwszy post witam wszystkich :)
Programując w BCB c++ "główny program" mogę powiadomić o zakończeniu wątku przekazując mu metodę jaka na zostać wywalana gdy ten się zakończy działanie np:
W uproszczeniu 
```cpp
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
  WatSpr  = new WatekSprawdz(true);
  WatSpr  ->OnTerminate = MyOnTerminate;
  WatSpr  ->Resume();
  this->ileWatkow++;

}

void __fastcall TForm1::MyOnTerminate(TObject *Sender)
{
  this->ileWatkow --;
  StatusBar1->Panels->Items[1]->Text="Wątków: "+IntToStr(this->ileWatkow);

}

Chodzi o to jak to zrealizować w C#
Watek testowy tworze następującym kodem:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int iNrWtk = 0;

        public Form1()
        {
            InitializeComponent();
        }
       
		private void button1_Click(object sender, EventArgs e)
        {
            MyTestWatek mywatek = new MyTestWatek();
            mywatek.mytextBox = this.textBox1;
            mywatek.iNrListViev = iNrWtk;
            Thread watek = new Thread(mywatek.CialoWatku);
            watek.Start();
            iNrWtk++;
        }
	}
}

// Klasa testowa obslugiwana w ramach watku
public class MyTestWatek
{
    public string name;
    public int iNrListViev;
    public TextBox mytextBox;

    public delegate void UpdateTextCallback(string message);

    public void CialoWatku()
    {
        for (int i = 0; i < 10; i++)
        {
            string doinfo = "NR dla ListViev: " + iNrListViev.ToString() +" - jj:"+ i.ToString();
            mytextBox.BeginInvoke(new UpdateTextCallback(UpdateText), new object[] { doinfo });
            Thread.Sleep(100);
        }
    }
    
    private void UpdateText(string message)
    {
        mytextBox.AppendText(message + Environment.NewLine);
    }
}

Generalnie chodzi o to, że watki mają być tworzone w metodzie onTime która ma interval na 100 ms jeśli powiedzmy 10 watek zakończy pracę iNrWtk = 9 ma być tworzony nowy tak by cały cas zadana liczba watkow pracowała.

Jak to zrealizować w C# ?

0
mytextBox.BeginInvoke(new UpdateTextCallback(UpdateText), new object[] { doinfo });

To chyba z jakichś przestarzałych przykładów, spokojnie powinno się skompilować coś takiego:

mytextBox.BeginInvoke(UpdateText, doinfo);
public delegate void UpdateTextCallback(string message);

To jest definicja typu, nie pola klasy.
Przydałoby się jeszcze coś w stylu

public UpdateTextCallback updateTextCallback;

co jest równoznaczne z

public Action<string> updateTextCallback;

więc wcale nowego typu tworzyć nie trzeba...

Ale poczytaj lepiej o eventach.

0

OK, ale odpowiedz nie tyczy mojego pytania. Co do przestarzałych to może być, bo ostatnio z c# miałem styczność w kwestii wątków 2 lata temu.
Czyli nadal nie wiem jak powiadomić okno główne programu który wywołało wątek'i o ich zakończeniach :)

Inaczej - jak mogę o ile to możliwe z poziomu mojego wątku wywołać metodę z formy głównej taka analogia do update w textBoxie.

0

Zamiast wątku proponuę użyć Task (.NET 4.0+). W kodzie masz przykład odwołania się do interfejsu graficznego.

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WFtest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();            
        }

        private void button1_Click(object sender, EventArgs e)
        {            
            Task.Factory.StartNew(() =>
            {
                // symulacja ciężkich obliczeń
                int i = 10;
                while (i > 0)
                {
                    System.Threading.Thread.Sleep(100);
                    i--;
                }

                // update interfejsu graficznego
                this.Invoke((MethodInvoker)delegate
                {
                    textBox1.Text = "uff ...";
                });    
            });
            
        }
    }
}

Jeżeli chcesz "utrzymywać" 10 wątków non-stop to tak jak pisałeś utwórz timer który będzie okresowo sprawdzać ilość wątków i dodawać nowe jeżeli ilość jest mniejsza niż założone 10. Ilość wątków przechowuj koniecznie w zmiennej typu volatile. Dodawaj 1 gdy tworzysz wątek (zdarzenie timer-a), odejmuj 1 gdy wątek się kończy (na końcu kodu wątku).

1 użytkowników online, w tym zalogowanych: 0, gości: 1