Witam!
Mam następujący problem:
Piszę aplikację desktopową,która ma na celu okresowo odpytywać pewne urządzenia po TCP oraz ich poszczególne parametry, aktualny stan wyświetlać w DataGridView. Do urządzeń tych dołączona jest dll-ka napisana w Delphi, także poszczególne funkcje odpytujące urządzenia zaimportowane są z biblioteki. Posiadam klasę urządzenia która w przypadku dołączenia nowego urządzenia do monitorowania tworzy w konstruktorze nowy wątek dla tego urządzenia w którym odpytuje go okresowo.
Thread backgroudThread = null;
private static object threadLock = new object();
public konstruktor()
{
backgroudThread = new Thread(new ThreadStart(RefreshData));
backgroudThread.IsBackground = true;
backgroudThread.Start();
}
public void RefreshData()
{
do
{
lock (threadLock)
{
funkcjaKomunikacjiZUrzadzeniemZDllki();
Thread.Sleep(10);
innaFunkcjaKomunikacjiZUrzadzeniemZDllki();
Thread.Sleep(10);
refreshTable();
}
} while (true);
}
Problem polega na tym, że aplikacja zawiesza się w przypadku aktualizacji pól DataGridView funkcją RefreshTable() (która aktualizuje pola DataGridView za pomocą Invoke oraz dodaje nowe wiersze do tabeli za pomocą Invoke). Bardziej bolesne jest to, że mogę pól tabeli nie aktualizować (DataGridView pozostaje puste) a jedynie w wątkach odpytywać poszczególne urządzenia (wieć nie modyfikuje stanu kontrolek), a mimo to w przypadku robienia czegoś w aplikacji np. częstego rozwijania menu strip aplikacja również się zawiesza. Gdy nie robię nic a jedynie odpytuje urządzenia to aplikacja działa bez problemów. DataGridView nie jest podpięte do żadnego DataSource, ale w przypadku nie modyfikowania kontrolek to chyba nie ma znaczenia a aplikacja mimo to się zawiesza, wystarczy kilka razy rozwinąć menu strip.
Proszę o pomoc. Może ktoś z was zna dobre narzędzie do monitorowania wątków aplikacji C#(korzystam z C# express oraz SharpDevelope)