Wątki - Invoke - kilka pytań

0

Witam.

Dopiero zaczyna programowac w .net i mam kilka pytan dotyczacych Invoke... o ile latwo znalazlem jak Invoke uzywac i kiedy... to co wlasciwie robi ta funkcja to nie wiem...
a sprawa wyglada tak... napisalem klase, ktorej jedna z funkcji wykonywana jest w osobnym watku... z tego watku co jakis czas informuje watek glowny o postepach w pracy... zglaszane jest zdarzenie... w "obsludze" tego zdarzenia w watku glownym korzystam z funkcji Invoke, dokonuje niezbednych obliczen na otrzymanych danych i aktualizuje formatki... a moje pytanie jest takie... czy przy okazji wykorzystania funkcji Invoke, mam zagwarantowane, ze wszystkie moje obliczenia dokonywane na danych otrzymanych z watku potomnego wykonywane sa w watku macierzystym??

i druga sprawa... zdarza sie, ze gdy zamykam aplikacje to dostaje komunikat: "An unhandled exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll Additional information: Bezpieczne dojście zostało zamknięte" domyslam sie, ze to sprawa zwiazana wlasnie z funkcja Invoke... ale jak sie przed tym zabezpieczyc??

0

Ad1: Możesz użyć SynchronizationContext aby wykonać pewne operacje w ramach innego wątku (czytaj: tego, gdzie są twoje formatki).

0

dzieki za propozycje :)... zaczynam sie przygladac :)...

ale walcze jeszcze z tym Invoke :)... zastosowalem to w dwoch miejscach... w jednym dziala bez problemu :)... a w drugim czasami :D...

kod mam taki...

private delegate void LogDelegate(String s, Urzadzenie u, Kierunek k);
        public void LogWriteLine(String s, Urzadzenie u, Kierunek k)
        {
            if (InvokeRequired)
            {
                BeginInvoke(new LogDelegate(LogWriteLine), new object[] { s, u, k });
                return;
            }
            /*czesc kodu odpowiedzialna za aktualizaje RichTextBox*/
         }

funkcja LogWriteLine wywolywana jest w innym watku poprzez zdarzenie...

public delegate void LogujDelegate(String s, Urzadzenie u, Kierunek k);
/*...*/
public event LogujDelegate LogDel;
protected void Loguj(String s, Urzadzenie u, Kierunek k)
{
        if (LogDel != null)
            LogDel(s, u, k);
}

a w glownej formie "ustawiam" to zdarzenie tak...

LogujDelegate ld; //jako pole klasy
/*...*/
ld = new LogujDelegate(logi_form.LogWriteLine);
tab[0].LogDel += ld;

a sprawa prezentuje sie tak, ze bez zmian w kodzie, dla tej samej kompilacji, dzialanie programu czasami zostaje przerwane, przez blad:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: Nieprawidłowa operacja między wątkami: do formantu 'k_richTextBox' uzyskiwany jest dostęp z wątku innego niż wątek, w którym został utworzony.

a czasami nie... z tego co zaobserwowalem (czysto empiryczne badania ;))... program ma zdecydowanie wieksze szanse wykonac sie bez tego bledu gdy forma w ktorej uaktualniam k_richTextBox jest widoczna :)... i nie mam pojecia czemu to nie dziala :(... i czy rzeczywiscie widocznosc formy ma wplyw na ten blad... czy ma ktos jakis pomysl??

EDIT:
zaobserwowalem cos wiecej... blad nieprawidlowej operacji miedzy watkami nie przerywa dzialania gdy forma jest wyswietlana... ale raczej wystarczy by byla choc raz wyswietlona przed wywolaniem funkcji LogWriteLine... czyli, wystarczy, ze w czasie inicjalizacji programu wykonam:

logi_form.Show();
logi_form.Hide()

i juz nie mam tego bledu (w sensie: przy kilku probach nie pojawil sie :D)... jakos to dla mnie ta zaleznosc "grubymi nicmi szyta"... o co tu chodzi, czemu to tak dziala??

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