Wątki i optymalizacja programu.

0

Cześć !

Mam program, który pobiera informacje z bazy danych. Wszystko działa bez większego problemu do czasu gdy nie pojawi się więcej urządzeń do których trzeba pobrać te informacje.
Problem wygląda następująco. Mam timer, który odlicza 0,2s i w tym timerze tworze nowy wątek, który obsługuje funkcje pobierania info. z bazy. Wszystko działa dobrze do czasu gdy urządzeń jest 50+ i wtedy program zaczyna mocno spowalniać, informację przychodzą z opóźnieniem.

Chciałem zapytać w jaki sposób najlepiej rozwiązać ten problem. Jaką zasadę przyjąć aby program działał płynnie i bez lagów...

1

Podałeś za mało szczegółów. Po pierwsze należałoby ustalić co jest wąskim gardłem czy baza danych czy też spowalnia przez ilość wątków. Można zastosować pulę wątków zamiast tworzenia za każdym razem nowych. W niektórych przypadkach stosuje się odwołania asynchroniczne zamiast synchronicznych wątków, jeżeli to możliwe. Bardzo przydatne może się okazać cachowanie zapytań. Temat cachowania jest bardzo złożony po pierwsze można cachować zapytania po stronie bazy danych (właściwie robi to sama baza, ale można jej jeszcze pomóc konfiguracją), po drugie można cachować dane po stronie aplikacji.

0

Za każdym razem tworzysz nowy wątek ? jeżeli te akcje są szybkie, to więcej zasobów możesz tracić na stworzenie, odpalenie i zarządzanie takim wątkiem. Macie tam jakieś egzekutory ?

0

Zrób to pobieranie z bazy asynchronicznie.

0

Tak tworze nowy wątek... Jak zrobić pobieranie asynchroniczne ?

0

Google nie masz? Szukaj haseł takich jak:

  • Task
  • Asynchronous Pattern
  • Task Parallel Library
  • Thread pool
0

Masz jedną bazę danych do wszystkich urządzeń? Bo to może być wąskie gardło i być może szukasz w złym miejscu? Możliwe że będzie cię czekać optymalizacja zapytań.

I znów wszystko sprowadza się do: Za mało informacji

0

Najpierw pobieram systemy i urządzenia następnie w funkcji pobieram wszystkich inf. które mi są potrzebne:

 
  foreach (var urzadzenie in urzadzenia_lista) // PRZESZUKAJ URZĄDZENIA    
            {

  if (urzadzenie.urzadzenie == "typ1" ) 
                {
                    using (var baza= new bazaEntities()) 
                    {
                        
                        var q1 = (from a in baza.device_property_value where a.system_id == urzadzenie.system_id where a.device_id == urzadzenie.id where a.prop_id == 5 select new { a.prop_val, a.device_id, a.system_id, a.prop_id }).ToArray();

                        foreach (var parametry in q1)
                        {
                            if (urzadzenie_id == parametry.device_id && urzadzenie.system_id == parametry.system_id)
                                urzadzenie.costam = parametry.prop_val.ToString();
                        }

var q2 [...]
....

var q20 [...]

Tak to wygląda dla danego urządzenia. Urządzeń może być nawet ponad 200 i do każdego typu urządzenia minimum 15 parametrów do pobrania. Typów urządzeń jest 5;

0

Dlaczego nie pobierzesz wszystkich urządzeń z listy jednym zapytaniem? Nie mam doświadczenia w LinqToSQL, ale powinno się dać.

0

No pobieram, napisałem na samym początku. Potem przeszukuję urządzenia, które zostały pobrane i do tych urządzeń pobieram informacje, które są dla mnie istotne.

1

Chodziło mi o parametry. Może hurtem też pobieraj parametry do urządzeń tego samego typu?

0

Czyli myślisz, że lepiej będzie zrobić coś takiego:


var q1 = (from a in baza.device_property_value where a.system_id == urzadzenie.system_id where a.device_id == urzadzenie.id select new { a.prop_val, a.device_id, a.system_id, a.prop_id }).ToArray();
 
                        foreach (var parametry in q1)
                        {
                            if ( parametry.prop_id == 5)
                                urzadzenie.costam = parametry.prop_val.ToString();

   if ( parametry.prop_id == 6)
                                urzadzenie.costam1 = parametry.prop_val.ToString();

   if ( parametry.prop_id == 7)
                                urzadzenie.costam2 = parametry.prop_val.ToString();

                        }

 
3

Raczej coś takiego:

var q1 = (from a in baza.device_property_value where lista_urzadzen.Any(u => u.system_id == a.system_id && u.id == a.device_id) select new { a.prop_val, a.device_id, a.system_id, a.prop_id }).ToArray();

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