[C#] Watki i wywolanie metody z Form1 z watka

0

Potrzebuje pomocy - małej cegiełko by ruszyć dalej ;)
Problem jest następujący na przykładzie kodu testowego:

namespace WindowsFormsApplication1
{
    public delegate void SetTextCallback();

    public partial class Form1 : Form
    {
        public int iWywolan = 0;

        public Form1()
        {
            InitializeComponent();
        }

		public void ZaktualizujZWatka()
        {
            this.iWywolan--;
            Debug.WriteLine("Wywołano z watka :" + this.iWywolan.ToString());
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.iWywolan++;
            TestWatka thread = new TestWatka();
            dziswatek.WykonajWWateku();
            Thread thread = new Thread(new ThreadStart(TestWatka.WykonajWWateku));
            thread.Start();
        }

	}
}

public class TestWatka
{
	public void WykonajWWateku()
    {
		Debug.WriteLine("Metoda watka...");
		// Jak z poziomu tego kodu wykonywanego w ramach watku 
		// wywolac metode ZaktualizujZWatka
		// znajdujaca się w kalsie Form1 ????
	}
}

Pytanie brzmi jak w metodzie watką WykonajWWateku wywołać metodę z innej klasy która ten watek utworzyła w tym wypadku metodę ZaktualizujZWatka kalsy Form1 ???

Prosił bym o przykładowy kod rozwiązania.

0

Możesz użyć ParametrizedThreadStart, i w argumencie przekazać referencję do obiektu, w którym wątek jest uruchamiany(czyli this).

0

Dzięki ! Działa :)

Prosił bym jeszcze o sprawdzenie czy nie ma w tym testowym kodzie błędu:


public delegate void SetTextCallback();

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

     /// Tutaj kod formy 

        private void button10_Click(object sender, EventArgs e)
        {
            this.iWywolan++;
            TestWatka dowatek = new TestWatka();
            Thread oThread = new Thread(new ParameterizedThreadStart(dowatek.WykonajWWateku));
            oThread.Start(this);
            textBox2.Text = "Stan iWywolan: " + this.iWywolan.ToString();
        }

        public void ZaktualizujZWatka()
        {
            this.iWywolan--;
            textBox2.Text = "Stan iWywolan: " + this.iWywolan.ToString();
            Debug.WriteLine("Wywołano z watka.." + this.iWywolan.ToString());
        }
  }

}
// Watek
public class TestWatka
{
    public void WykonajWWateku(object oData)
    {
        Debug.WriteLine("Metoda watka kasy TestWatka...");
        // Jak z poziomu tego kodu wykonywanego w ramach watku 
        // wywolac metode ZaktualizujZWatka
        // znajdujaca się w kalsie Form1 ????
        Thread.Sleep(1000);
        Form1 odform = (Form1)oData;
        odform.Invoke(new SetTextCallback(odform.ZaktualizujZWatka));
     
    }
}

Lub podanie możliwych zmian / ulepszeń :)

0

Może ktoś dobrze znający się na C# spojrzeć na kod ... Czy w takim wydaniu może być lub / oraz podać propozycje zmian :)

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