[C#] Współbieżność, konflikty wątków

0

Mam aplikację która składa się z dwóch formatek: Form1 i Form2.
W Form1 mam stworzone obiekty parę DataTable z jednego DataSet. Mam tu też utworzony oddzielny wątek który wywołuje mi cyklicznie update i fill na tych tabelach (dokladnie timer z System.Threading.Timer).
W Form2 jest dataGridView który operuje na DataTable stworzonych w Form1.

W związku z tym pytanie, czy pomiędzy wątkiem z Form1 a dataGridView mogą wystąpić konflikty?

0

AFAIK timer to nie jest oddzielny wątek, metody podpięte pod timer wywołują się w kontekście głównego wątku (tak przynajmniej jest pod win32). nie ma tutaj mowy o współbieżności.

0

To wszystko zależy od tego z jakiego timer korzystasz.
Timer z klasy System.Windows.Forms.Timer wykonuje się w kontekście wątku głównego, natomiast ten z System.Threadnig.Timer oraz System.Timers.Timer wykonują się już w oddzielnych wątkach. Co do tego nie mam wątpliwości

0

Wiem, że mogą pojawiać się problemy z dostępem do pól Formatki, gdy korzystasz z System.Threadnig.Timer, najlepiej zmień go na System.Windows.Forms.Timer i problemów nie powinno być żadnych.

0

Problem z dostępem do formatki mam już załatwiony (to się robi dosyć łatwo).
Chodzi mi tylko o same operacje na obiekcie DataSet, czyli jednoczesne zrobienie metody Fill oraz dodanie wiersza do dataGridView. Wtedy mogą wystąpić niepożądane przeploty.

0

to zależy co chcesz osiągnąć, można zrobić zdarzenie w delegacie i wysłać je do formy2 i tam asynchronicznie lub na drugim wątku dołączonym ..join() wykonać dodanie rekordu. Czy chcesz wstrzymać wątek główny lub operacje na form1 gdy rekord jest dodawany w form2 ? Czy chcesz, aby odbywało się to "jednocześnie" ? Jeśli chodzi o przeploty możesz użyć Mutexa, albo Semafora. Obydwa rozwiązania powinny zapewnić bezpieczeństwo jeśli chodzi o dostęp do tego samego dataseta, lub tak jak wspominałem oprzeć to na zdarzeniach (w delegatach zaimplementowanych do wykonania operacji na innych wątkach)

więcej http://www.albahari.com/threading/part2.aspx#_Synchronization_Essentials

0
si3ma napisał(a)

Jeśli chodzi o przeploty możesz użyć Mutexa, albo Semafora (..)

mozna tez po prostu wszedzie uzywac lock(dataset){do sth z dataset}..
uzycie delegatow i przenoszenie faktycznego wykonania pracy do tamtegoinnego watku jest wymagane tylko np. jesli operacja grozi natychmiastowa proba odswiezenia czegos na gui poprzez eventy on?changed dataseta

0

Można użyć synchronizacji:

W wątku głównym:

SynchronizationContext Sync = SynchronizationContext.Current;

Metoda pomocnicza:


public delegate void GenericEventHandler<A>(object sender, A args);

internal void PostCallback<A>(GenericEventHandler<A> handler, A args) {
            if (handler == null)
                return;
            Sync.Post(new SendOrPostCallback((state) => { handler(this, args); }), null);
        }

I teraz wrzucamy eventy z różnych wątków bez obaw:

PostCallback<EventArgs>(EventName, EventArgs.Empty);

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