private void rilasciaRisorsePaginaPrecendete(int pageNumber) { // Sulla prima pagina non ho ancora nulla da fare if (pageNumber == 0) { return; } // Libero un pò di memoria, ammesso di fare ancora in tempo. foreach (IImmagine immagine in immaginiPaginaPrecedente) { immagine.Dispose(); } immaginiPaginaPrecedente.Clear(); if (lastLoadedPage != null) { lastLoadedPage.Dispose(); lastLoadedPage = null; } // Qualche cabala + incantesimi FormuleMagiche.rilasciaMemoria(); // Dopo il passaggio a .net 4.6 e sqlite aggiornato, questo non funziona più e si pianta // FormuleMagiche.attendiGcFinalizers(); // FormuleMagiche.rilasciaMemoria(); }
private void Provinatore_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { _cronoFine = DateTime.Now; FormuleMagiche.rilasciaMemoria(); var tempo = _cronoFine - _cronoInizio; _giornale.Debug("Crono = " + tempo.TotalSeconds); }
/// <summary> // azzero la gallery corrente e rilascio la memoria eventualmente utilizzata dalle foto /// </summary> private void svuotaGalleryCorrente() { if (fotografie != null) { foreach (Fotografia f in fotografie) { AiutanteFoto.disposeImmagini(f, IdrataTarget.Tutte); } FormuleMagiche.rilasciaMemoria(); } fotografie = null; }
public void chiusoSnapshotPubblicoWindow(object sender, EventArgs e) { _snapshotPubblicoWindow.Closed -= chiusoSnapshotPubblicoWindow; _snapshotPubblicoWindow = null; // Se ho aperto lo ss, lo riporto in primo piano. if (_slideShowWindow != null) { _slideShowWindow.Topmost = true; } FormuleMagiche.attendiGcFinalizers(); }
public void Execute(object parameter) { try { _giornale.Debug("Eseguo RelayCommad: " + _execute.Method.ToString() + " parametro=" + parameter); esegui(parameter); if (_afterExecute != null) { _giornale.Debug("RelayCommad invoco after execute"); _afterExecute.Invoke(parameter); } _giornale.Debug("Esecuzione RelayCommad completata: " + _execute.Method.ToString() + " parametro=" + parameter); } catch (OutOfMemoryException ofm) { long memoryPrima = Process.GetCurrentProcess().WorkingSet64; FormuleMagiche.attendiGcFinalizers(); long memoryDopo = Process.GetCurrentProcess().WorkingSet64; _giornale.Error("finita la memoria: prima=" + memoryPrima + " dopo=" + memoryDopo); if (_execute.Target is ViewModelBase) { ViewModelBase viewModel = _execute.Target as ViewModelBase; if (viewModel.dialogProvider != null) { viewModel.dialogProvider.ShowError(ofm.GetType().Name + "\n" + ErroriUtil.estraiMessage(ofm), "Errore imprevisto.", null); } } } catch (Exception ee) { _giornale.Error(_execute.Method.ToString(), ee); if (_execute.Target is ViewModelBase) { ViewModelBase viewModel = _execute.Target as ViewModelBase; if (viewModel.dialogProvider != null) { viewModel.dialogProvider.ShowError(ee.GetType().Name + "\n" + ErroriUtil.estraiMessage(ee), "Errore imprevisto. Consultare il Log", null); } } // per ora non voglio far spaccare il programma altrimenti perdo il lavoro in corso. // anche se concettualmente sarebbe più corretto rilanciare l'errore. // L'unico problema è che non c'è modo di fare un try-catch di un Command. // throw ee; } }
public void chiusoPubblicoWindow(object sender, EventArgs e) { if (_pubblicoWindow != null) { _pubblicoWindow.Closed -= chiusoPubblicoWindow; _pubblicoWindow = null; } if (!azioneInCorso) { stavaGirandoPubblico = false; } FormuleMagiche.attendiGcFinalizers(); }
public void outOfMemoryImmagini() { const int quante = 1000; const int ogniTotPurga = 100; List <Fotografia> ff = cercaFotoQuasiasi(5); // Ricavo la memoria libera prima del test long memoryPrima = Process.GetCurrentProcess().WorkingSet64; for (int ii = 0; ii < quante; ii++) { foreach (Fotografia f in ff) { AiutanteFoto.idrataImmaginiFoto(f, IdrataTarget.Tutte); AiutanteFoto.disposeImmagini(f, IdrataTarget.Tutte); // ogni tot iterazioni, vado a liberare la memoria che inspiegabilmente non viene pulita. if ((ii % ogniTotPurga) == 0) { // ATTENZIONE: IMPORTANTE. // Se non metto questa formula magica, // il GC non pulisce la memoria occupata dalla bitmap (inspiegabilmente) FormuleMagiche.rilasciaMemoria(); } long memoryDurante = Process.GetCurrentProcess().WorkingSet64; long consumata = (memoryDurante - memoryPrima); // Se supero il massimo impostato, probabilmente il gc non sta pulendo. if (consumata > maxMem) { Assert.Fail("Probabilmente si sta consumando troppa memoria: diff(MB)=" + consumata / 1024); } } } }
public void outOfMemoryStampa() { long memoryPrima = Process.GetCurrentProcess().WorkingSet64; string[] nomiFilesImmagine = Costanti.NomiFileImmagini; // 10 foto x 50 giri = 500 foto foreach (string nomeFileImmagine in nomiFilesImmagine) { for (int giri = 1; giri <= 50; giri++) { using (PrintServer ps1 = new PrintServer()) { using (PrintQueue coda = ps1.GetPrintQueue(Costanti.NomeStampante)) { PrintDialog dialog = new PrintDialog(); dialog.PrintQueue = coda; Size areaStampabile = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight); // Ora creo il documento che andrò a stampare. // L'uso di un FixedDocument, mi permetterà di interagire con misure, dimensioni e margini FixedDocument document = new FixedDocument(); document.DocumentPaginator.PageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight); // Creo una pagina della grandezza massima FixedPage page1 = new FixedPage(); page1.Width = document.DocumentPaginator.PageSize.Width; page1.Height = document.DocumentPaginator.PageSize.Height; page1.VerticalAlignment = VerticalAlignment.Center; page1.HorizontalAlignment = HorizontalAlignment.Center; // Per fare in modo che l'immagine venga centrata bene automaticamente, e non venga tagliata solo da una parte ma nel centro, // non devo mettere le dimensioni al componente Image, ma devo creare // una Grid più esterna con le dimensioni precise. Grid grid = new Grid(); grid.Height = page1.Height; grid.Width = page1.Width; // Creo una immagine che contiene la bitmap da stampare Image image = new Image(); image.VerticalAlignment = VerticalAlignment.Center; image.HorizontalAlignment = HorizontalAlignment.Center; // E' importante fare la dispose dell'oggetto Immagine using (ImmagineWic qq = new ImmagineWic(nomeFileImmagine)) { image.Source = qq.bitmapSource; image.Stretch = Stretch.UniformToFill; image.StretchDirection = StretchDirection.Both; grid.Children.Add(image); page1.Children.Add(grid); // add the page to the document PageContent page1Content = new PageContent(); page1Content.Child = page1; document.Pages.Add(page1Content); // // ----- STAMPA per davvero // dialog.PrintDocument(document.DocumentPaginator, "test" + giri.ToString()); foreach (var fixedPage in document.Pages.Select(pageContent => pageContent.Child)) { fixedPage.Children.Clear(); } } // ATTENZIONE: IMPORTANTE. // Se non metto questa formula magica, // il GC non pulisce la memoria occupata dalla bitmap (inspiegabilmente) FormuleMagiche.rilasciaMemoria(); } } long memoryDopo = Process.GetCurrentProcess().WorkingSet64; long consumata = (memoryDopo - memoryPrima); // Se supero il massimo impostato, probabilmente il gc non sta pulendo. if (consumata > maxMem) { Assert.Fail("Probabilmente si sta consumando troppa memoria: diff(MB)=" + consumata / 1024); } } } }