首页 > 解决方案 > 为什么在另一个线程/任务中调用 puppeteer 时会挂起

问题描述

我正在使用 puppeteersharp 进行一些刮擦。我想在不同的线程中操作页面,例如以定期间隔获取页面的 html(逻辑并不重要)。

每次我尝试在 Thread 中调用 puppeteer 时,都会在该行中堆栈执行。

在此示例代码中:

Browser _puppeteerBrowser = await PuppeteerSharp.Puppeteer.LaunchAsync(new LaunchOptions
{
    Headless = false,
    ExecutablePath = _chromePath
});

Page Page = (await _puppeteerBrowser.PagesAsync()).FirstOrDefault();

var task = Task.Run(async () =>
{
    var content = await Page.GetContentAsync(); // it never returns!!
    System.Console.WriteLine(content.Length);
});

await Page.GoBackAsync(); // it works fine

task.Wait(); // never ends because of the stack inside the thread

我尝试了 Timer、Task、Thread 的不同变体,但每次我尝试在另一个线程中的 puppeteer 中做某事时,它都会挂起。我怎样才能解决这个问题?一般来说,如果我们想在不同的线程中使用相同的 Puppeteer(例如,也许我们想观察浏览器中的某些内容是否在“主流程”之外发生了变化)如何做到这一点?

标签: c#.netmultithreadingpuppeteerpuppeteer-sharp

解决方案


推荐阅读