es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tenemos dificultades para utilizar el método .Dispose() con el método return en PuppeteerSharp.

Estoy luchando con .Dispose() y Chromium se acumula y hace que mi computadora se bloquee porque este es un proceso que se deja durante días.

Sin embargo, no puedo poner .Dispose() después de return porque será inalcanzable, y si lo pongo antes de return, la cadena de contenido se volverá obsoleta.

    var docBContent = await renderHtmlAsync(url2);
    fromDoc.LoadHtml(docBContent);

public static async Task<string> renderHtmlAsync(string url2)
{
    await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);
    Browser browser = await Puppeteer.LaunchAsync(new LaunchOptions
    {
        Headless = true
    });
    var page = await browser.NewPageAsync();
    page.DefaultTimeout = 0;
    var navigation = new NavigationOptions
    {
        Timeout = 0,
        WaitUntil = new[] {
                WaitUntilNavigation.DOMContentLoaded }
    };
    await page.GoToAsync(url2, navigation);
    var content = page.GetContentAsync();

    return await content;
}

Esto es lo que aparece, incluyendo las soluciones mencionadas hasta ahora:
enter image description here

¿Cómo puedo abordar esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que el proceso de Chromium no se está eliminando correctamente, lo que lleva a una acumulación de memoria que eventualmente hace que la computadora se bloquee. Sin embargo, simplemente agregar .Dispose() no es una solución viable ya que haría que el contenido se vuelva obsoleto.

    Una solución potencial es utilizar la instrucción using para desechar automáticamente los recursos cuando ya no sean necesarios. Por ejemplo:

    public static async Task<string> renderHtmlAsync(string url2)
    {
        await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);
    
        using(var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        }))
        {
            var page = await browser.NewPageAsync();
            page.DefaultTimeout = 0;
    
            var navigation = new NavigationOptions
            {
                Timeout = 0,
                WaitUntil = new[] { WaitUntilNavigation.DOMContentLoaded }
            };
    
            await page.GoToAsync(url2, navigation);
            var content = page.GetContentAsync();
    
            return await content;
        }
    }
    

    Al utilizar using aquí, la variable browser se eliminará automáticamente tan pronto como la ejecución abandone el ámbito del bloque using. Esto garantiza que el proceso de Chromium se termine correctamente y el uso de memoria se mantenga bajo control.

    Además, dado que el objeto browser también elimina el objeto page, no es necesario agregar una llamada separada a page.CloseAsync() o page.Dispose().

    Al implementar este enfoque, debería resolverse la acumulación de procesos de Chromium y los bloqueos posteriores de la computadora.

Comments are closed.