Skocz do zawartości

[Sfera] Szukanie wycieku pamięci

Polecane posty

Przygotowałem aplikację, która importuje urządzenia serwisowe do Subiekta, za pomocą Sfery. Przy okazji, odbywają się też, odpowiednio dodawanie zleceń serwisowych, według określonych reguł, ale to już za pomocą Sfery zdarzeniowej. No i po około 600 wierszach, wywala mi błędem pamięci. Stosuje dodawanie w "using", przejrzałem zmienne z obu rozwiązań, czy gdzieś nie dodać Dispose, ale wyglądało ok. Podłączyłem wiec Debugowanie, zrobiłem Sobie dwie migawki i z analizy różnicy, wygląda, że sporą część tej pamięci, pochłonęły różne elementy Reguł Automatyzacji. Te wynikają, z ustawień użytkownika, i Swoje zapewne robią, ale pytanie, czy ja mogę jakoś odpowiednio wpłynąć na to, aby i one pamięć zwalniały?

 

Różnica w pamięci z Debugera:

image.thumb.png.700b9a967219f6ee7efffba677408e97.png

Kod sfery zdarzeniowej, dodający Zlecenie:

                        Debug.WriteLine("Tworzymy nowe zlecenie serwisowe - Po zapisaniu urządzenia.");
                        IScenariuszeObslugiKlienta scenariusze = kontekst.Uchwyt.PodajObiektTypu<IScenariuszeObslugiKlienta>();
                        IKategorieZlecenSerwisowych kategorie = kontekst.Uchwyt.PodajObiektTypu<IKategorieZlecenSerwisowych>();
                        IRodzajeZlecenSerwisowych rodzaje = kontekst.Uchwyt.PodajObiektTypu<IRodzajeZlecenSerwisowych>();
                        IAsortymenty asortymenty = kontekst.Uchwyt.PodajObiektTypu<IAsortymenty>();
                        // tworzenie nowego zlecenia serwisowego
                        using (IZlecenieSerwisowe zlecenie = zlecenia.Utworz())
                        {
                            zlecenie.Dane.Podmiot = urzadzenieZapisane.Dane.Wlasciciel;
                            zlecenie.Dane.ScenariuszObslugiKlienta = scenariusze.Znajdz(s => s.Nazwa == k.Value.DocelowyScenariusz).Dane;
                            zlecenie.Dane.KategoriaZleceniaSerwisowego = kategorie.Znajdz(s => s.Nazwa == k.Value.DocelowyKategoria).Dane;
                            zlecenie.Dane.RodzajZleceniaSerwisowego = rodzaje.Znajdz(s => s.Nazwa == k.Value.DocelowyRodzaj).Dane;
                            zlecenie.Dane.SerwisowaneUrzadzenie = urzadzenieZapisane.Dane;

                            // określenie daty planowanej nowego zleceniaa
                            DateTime dataArchiwalnegoZlecenia = dataArchiwalnaUrzadzenia.Value;
                            DateTime planowanaData = dataArchiwalnegoZlecenia.AddMonths(k.Value.MiesiecyOdZakonczenia);
                            zlecenie.Dane.DataRozpoczecia = planowanaData;
                            zlecenie.Dane.PlanowanaDataZakonczenia = planowanaData;
                            Debug.WriteLine("Data zaplanowana: " + zlecenie.Dane.PlanowanaDataZakonczenia);

                            //zlecenie.Dane.DaneOpisoweZleceniaSerwisowego.DiagnozaProblemu = "Scenariusz: " + k.Value.DocelowyScenariusz;
                            if (!zlecenie.Zapisz()) { Debug.WriteLine("Nie można było zapisać zlecenia."); }
                            else
                            {
                                Debug.WriteLine("Zapisanie identyfikatorów nowego zlecenia.");
                                using (DbCommand addcommand = connection.CreateCommand())
                                {
                                    string zapytanieDodające = "INSERT INTO ModelDanychContainer.NOW_ZleceniaSerwisoweUtworzoneArchiwalne " +
                                        "(ZlecenieRealizujace_Id,Urzadzenie_Id,DocelowyScenariusz,DocelowyKategoria,DocelowyRodzaj) " +
                                        "VALUES(" + zlecenie.Dane.Id + "," + urzadzenieZapisane.Dane.Id + ",'" + k.Value.DocelowyScenariusz + "','" + k.Value.DocelowyKategoria + "','" + k.Value.DocelowyRodzaj + "');";
                                    addcommand.CommandText = zapytanieDodające;
                                    connection.Open();
                                    addcommand.ExecuteNonQuery();
                                    connection.Close();
                                }
                            }
                        }

Kodu dodawania urządzenia już nie wrzucam, bo nie obstawiam, że to z jego winy, tam zresztą jest using na Utworz i pola własne, no może jest ich 30 razem, ale to raczej nie to.

Ewentualnie jak inaczej szukać co pochłania tą pamięć, będę wdzięczny za podpowiedź, bo tutaj moje zasoby wiedzy, już wymiękają.

Link to postu

Załączony screen nie wskazuje na problemy ze zwalnianiem pamięci przez obiekty automatyzacji. Przeprowadzone przez nas testy również tego nie potwierdziły. Problem musi występować gdzieś indziej.

Czy byłby Pan w stanie podesłać nam kompletne rozwiązanie sferyczne, na którym możliwe byłoby zreprodukowanie problemu z wyciekami pamięci?

Link to postu
  • 3 tygodnie później...
×
×
  • Dodaj nową pozycję...