Skocz do zawartości

[SFERA] Potencjalny memory leak przy zapisie/kompletacji ZK i dod poz. do FS

Polecane posty

Witam!
 

We własnym projekcie lub waszym konsolowym przy zapisie/kompletacji ZK lub dodawaniu do istniejącej FS pozycji mam następujace "zjawisko" (kompletacja 66 pozyzji):

 

MemSnapshot.thumb.JPG.73f71dff169b6486386d54e008857973.JPG

Łaczenie ze sferą raz przy uruchomieniu aplikacji, po zapisie nie zwalnia pamięci - przyrost 10-20MB per/pozycja.  Kasowałem QueryCache, sprawdzałem z multi i single instance i siłowałem z GC zawze ten sam efekt.

Metoda:

 

public Dictionary<string, object> KompletujPozycjaZK(string uid, int zkId, PozycjaZamowiona _PozycjaRealizowana)
        {
            try
            {
                var totTimer = new Stopwatch();
                totTimer.Start();              


                IZamowieniaOdKlientow zamowienia = sfera.PodajObiektTypu<IZamowieniaOdKlientow>();               

                using (IZamowienieOdKlienta zk = zamowienia.Znajdz(z => z.Id == zkId))
                {
                    
                    if (zk.Dane.DataSprzedazy == null || (DateTime.Now.Date - zk.Dane.DataSprzedazy.Value.Date).TotalDays > 0)
                    {
                        zk.Dane.DataSprzedazy = DateTime.Now.Date;
                    }
                    var pozEncja = zk.Dane.Pozycje.FirstOrDefault(p => p.Id == _PozycjaRealizowana.Id);

                    if (pozEncja == null)
                        return new Dictionary<string, object> { { "error", "wybrana pozycja nie istnieje w Nexo" } };


                    if (_PozycjaRealizowana.IloscSkompletowana > pozEncja.IloscWJednostceBazowej)
                    {
                        var przelicznik = pozEncja.IloscWJednostceBazowej != pozEncja.Ilosc ? pozEncja.IloscWJednostceBazowej / pozEncja.Ilosc : 1.00M;
                        var ilosc = przelicznik != 1 ? _PozycjaRealizowana.IloscSkompletowana / przelicznik : _PozycjaRealizowana.IloscSkompletowana;
                        var iloscPierwotna = pozEncja.Ilosc.ToString();
                        pozEncja.UstawIlosc(ilosc);

                        _log.Info($"Zmiana ilości pozycji na większą niż zamówiona! ZK: {zk.Dane.NumerWewnetrzny.PelnaSygnatura}, Symbol Towaru:{pozEncja.AsortymentAktualny.Symbol}, Ilość pierwotna:{iloscPierwotna}, Nowa Ilość: {pozEncja.Ilosc}, UID: {uid}");
                    }

                    var jm = pozEncja.AsortymentAktualny.PodstawowaJednostkaMiaryAsortymentu;
                    
                    IDokumentRezerwujacy dokRezerwujacy = (IDokumentRezerwujacy)zk;


                    if (pozEncja.Rezerwacja != null && pozEncja.Rezerwacja.Ilosc > 0)
                    {
                        _log.Info($"Towar: {pozEncja?.AsortymentAktualny?.Nazwa} - ILOSC ZWALNIANA: {pozEncja.Rezerwacja.Ilosc} JMpodst: {pozEncja.AsortymentAktualny.PodstawowaJednostkaMiaryAsortymentu.Symbol()} JmMag: {pozEncja.JednostkaMagazynowa().Symbol()}");
                        dokRezerwujacy.ZwolnijRezerwacje(pozEncja, pozEncja.Rezerwacja.Ilosc, jm);
                    }

                    if (_PozycjaRealizowana.IloscSkompletowana > 0)
                        dokRezerwujacy.ZwiekszRezerwacje(pozEncja, _PozycjaRealizowana.IloscSkompletowana, jm);                                        
                    

                    pozEncja.GotowaDoRealizacji = true;
                    string sygnatura = zk.Dane.NumerWewnetrzny?.PelnaSygnatura ?? "";
                    string nazwaTw = pozEncja?.AsortymentAktualny?.Nazwa ?? "";


                    if (!zk.Zapisz())
                    {
                        _log.Info($"KompletujPozycjaZK - Błąd kompletacji pozycji: {sygnatura} Towar: {pozEncja?.AsortymentAktualny?.Nazwa}");
                        var bledy = sfera.PodajBledy(zk);
                        return new Dictionary<string, object> { { "error", $"Błąd kompletacji pozycji: {sygnatura}" } };
                    }
                    
                    totTimer.Stop();
                    var el = totTimer.Elapsed;
                    _log.Info($"KompletujPozycjaZK: {sygnatura} Towar: {nazwaTw} IloscSkompletowana: {_PozycjaRealizowana.IloscSkompletowana} Elapsed: {String.Format("{0:00}:{1:00}.{2:00}", el.Minutes, el.Seconds, el.Milliseconds / 10)}");
                    Debug.WriteLine($"Elapsed method TOTAL time: {String.Format("{0:00}:{1:00}.{2:00}", el.Minutes, el.Seconds, el.Milliseconds / 10)}");
                }


            }
            catch (Exception ex)
            {
                _log.Error(ex.Message);
                return new Dictionary<string, object> { { "error", "Błąd kompletacji pozycji: " + ex.Message } };
            }

            //GC.Collect();
            //GC.WaitForPendingFinalizers();
            //GC.Collect();
            return new Dictionary<string, object> { { "success", "Ok" } };

        }

 

Dodam że do wersji <=40 wszystko smigało...

 

Subiekt NEXO PRO 45

Sfera zdarzeniowa - brak

SQL Server 2016 Standard 64G RAM

 

Edytowane przez Darek FremanOfArrakis
Link to postu

Proszę w pierwszej kolejności wyeksportować dane diagnostyczne (w programie proszę nacisnąć Ctrl+Shift+H) i podesłać nam do analizy (może być w wiadomości prywatnej. Można również utworzyć plik zrzutu w menedżerze zadań windows i również podesłać nam do analizy.

Czy Pana aplikacja edytuje zamówienie w osobnym wątku?

Link to postu
×
×
  • Dodaj nową pozycję...