Generowanie plików graficznych na podstawie HTML zapycha pamięć

0

Witam Wszystkich!

Mówiąc bardzo skrótowo, pisze aplikację, która ma wygenerować pliki graficzne na podstawie plików HTML. Mam napisany fragment kodu, który z powodzeniem realizuje to zadanie. Natomiast przy większej ilości danych zapycha mi pamięć. Poniżej fragmenty kodu oraz błędy jakie otrzymuje podczas generowania.

Kod:

Stopwatch processStopWatch = new();
processStopWatch.Start();

await Parallel.ForEachAsync(productGroupIds, parallelOptions, async(groupId, token) =>
    {
        Stopwatch sw = new();
        sw.Start();
        //
        StartBrowser(source);
        //
        sw.Stop();
        
    }
processStopWatch.Stop();

private void StartBrowser(string source)
{
  var th = new Thread(() =>
    {
        using var webBrowser = new WebBrowser();
        webBrowser.ClientSize = new Size(PAGE_A4_WIDTH_PX, _pageHeight);
        webBrowser.ScrollBarsEnabled = false;
        webBrowser.DocumentText = source;
        //
        using (Bitmap bitmap =
        new Bitmap(
            PAGE_A4_WIDTH_PX,
            _pageHeight))
        {
            Rectangle rec = new Rectangle(0, 0, PAGE_A4_WIDTH_PX, _pageHeight);
            webBrowser.DrawToBitmap(bitmap, rec);
            bitmap.Save(_filePath + _fileName + ".jpg",
                System.Drawing.Imaging.ImageFormat.Jpeg);
            bitmap.Dispose();
        }
        //
        webBrowser.Dispose();
        Application.Run();
    });
    th.SetApartmentState(ApartmentState.STA);
    th.Start();
    Thread.Sleep(250);
}

Błędy:

  1. Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 0x80004003
    
  2. Error HRESULT E_FAIL has been returned from a call to a COM component. 0x80004005
    
  3. Bieżący proces wykorzystał wszystkie dozwolone przez system dojścia do obiektów Window Manager. (0x80070486)
    

Jeżeli można tak napisać to błędy generują się "losowo". Nie ma reguły kiedy który. W każdym razie zazwyczaj po wygenerowaniu około 3tys plików aplikacja zaczyna się sypać.

Z góry dziękuję za pomoc.

Pozdrawiam,

3

Ciężko stwierdzić jednoznacznie w czym może tkwić problem więc spróbuj tego co ci wypisze poniżej

  • użycie obiektu WebBrowser w wielu wątkach jednocześnie, uastawienie ApartmentState na STA powinno rozwiązać ten problem.
  • brak odpowiedniego zwalniania pamięci przez obiekt Bitmap, upewnij się, że Dispose() jest wywoływany po użyciu bitmapy.
  • ustawienie wielkości obiektu Bitmap na maksymalną dostępną wielkość ekranu, sprobuj zmniejszyć rozmiar bitmapy do mniejszej wartości i sprawdź czy bedą ci sie pojawiać błędy
  • problemy z pamięcią związane z wykorzystaniem wielu wątków może spróbuj skorzystać z jednego wątku lub zwiększyć ilość dostępnej pamięci dla aplikacj
3

Czemu wołasz Application.Run() w wątku?
Dispose na obiektach tworzonych w using jest zbędny, a w specyficznych przypadkach może doprowadzić do problemów.
Czy jesteś pewien, że webBrowser załadował dokument zanim się do tego dokumentu odwołasz?

3

Czy new Thread w ParallelForze to dobry/zasadny pomysł?

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