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 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); } } } }