gpt4 book ai didi

c# - Puppeteer Sharp 奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 18:11:31 24 4
gpt4 key购买 nike

我试图在另一个静态方法中调用 Browser.NewPageAsync(),但是当我调用它时,调用它的方法就退出了。

    partial class Program
{
static Browser Browser;

static async Task StartBrowser()
{
Browser = await Puppeteer.LaunchAsync
(
new LaunchOptions
{
Headless = true,
ExecutablePath = "Chromium\\chrome.exe"
}
);
Console.WriteLine("Browser launched");
}

static void StartScraping(int threads)
{
for (int i = 0; i < threads; i++)
{
Task.Run(async () =>
{
int ThreadNumber = i;
Console.WriteLine("Thread #" + ThreadNumber + " started");
Page p = await Browser.NewPageAsync(); //exits here
await p.GoToAsync("https://www.google.com");
Console.WriteLine("Content:\n" + await p.GetContentAsync());
});
}
}

static async Task MainAsync()
{
await StartBrowser();
StartScraping(1);
}

static void Main(string[] args)
{
MainAsync().GetAwaiter().GetResult();
}
}

例如:如果我在 MainAsync() 中调用 Browser.NewPageAsync(),则 Browser.NewPageAsync() 将被调用为预期。

最佳答案

我找到了一个解决方案:如果页面将在与其浏览器实例相同的范围内创建,则页面将按预期创建,否则 Task.Run()将因 NewPageAsync() 而卡住方法。

不良行为:

Task[] Tasks = new Task[1];
Browser browser = await Puppeteer.LaunchAsync
(
new LaunchOptions
{
Headless = true,
ExecutablePath = "Chromium\\chrome.exe"
}
);
for (int i = 0; i < Tasks.Length; i++)
{
int ThreadNumber = i;
Tasks[i] = Task.Run(async () =>
{
Page page = await browser.NewPageAsync(); //stucks
});
}

Task.WaitAll(Tasks);

正如预期的那样:

Task[] Tasks = new Task[1];
for (int i = 0; i < Tasks.Length; i++)
{
int ThreadNumber = i;
Tasks[i] = Task.Run(async () =>
{
Browser browser = await Puppeteer.LaunchAsync
(
new LaunchOptions
{
Headless = true,
ExecutablePath = "Chromium\\chrome.exe"
}
);
Page page = await browser.NewPageAsync(); //creates as expected
});
}

Task.WaitAll(Tasks);

无论如何,这不是最佳解决方案,因为我必须为异步任务创建浏览器,而不是为所有异步任务使用一个浏览器。希望有人能解释一下。感谢大家的帮助!

关于c# - Puppeteer Sharp 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57970079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com