提问人:Gerrit 提问时间:10/25/2023 最后编辑:Theodor ZouliasGerrit 更新时间:10/25/2023 访问量:102
Webview2 多线程冻结/停止
Webview2 multithreading freezes/stops
问:
我一直在做一个有趣的副业。基本上,我用 模拟了两个隐身浏览器。他们转到 X Instagram 个人资料列表并开始喜欢追随者的故事。我希望两者同时执行异步 Javascript 代码。所以我使用多线程。每个浏览器都有一个线程。问题是,当两个实例启动时,一个实例继续运行 script-loop 。但似乎另一个实例运行此方法几秒钟并冻结/停止?这有点奇怪,我真的不知道发生了什么。我可能忽略了一些东西,但我真的想不通。Webview2
Webview2
Webview2
Method4
private async void button1_Click(object sender, EventArgs e)
{
TabPage tabPage = new TabPage();
tabPage.Name = "tabPage" + (tabControl1.TabCount + 1);
tabPage.Text = "tabPage" + (tabControl1.TabCount + 1);
tabPage.Margin = tabControl1.TabPages[0].Margin;
tabPage.Padding = tabControl1.TabPages[0].Padding;
tabPage.Size = tabControl1.TabPages[0].Size;
CustomBrowser customBrowser = new CustomBrowser(this);
bool done = await customBrowser.InitBrowser();
tabPage.Controls.Add(customBrowser.webView2);
tabControl1.TabPages.Add(tabPage);
string name = names[0];
names.RemoveAt(0);
Thread browserThread = new Thread(async () =>
{
Method4(customBrowser, name);
});
threads.Add(browserThread);
}
首先,我创建一个带有实例的新选项卡(类执行该实例的所有初始化)。之后,我创建并定义一个线程,并将其添加到一个列表中。Webview2
CustomBrowser
Webview2
private void button2_Click(object sender, EventArgs e)
{
foreach (Thread browserThread in threads)
{
browserThread.Start();
}
}
在我用两个浏览器创建了两个选项卡后,我使用上面的代码启动了所有线程。两个线程现在都将开始执行,即:Method4
private async void Method4(CustomBrowser customBrowser, string scrape)
{
while (!customBrowser.BrowserStopped)
{
customBrowser.webView2.Invoke(new Action(async () =>
{
customBrowser.webView2.CoreWebView2.Navigate($"https://www.instagram.com/{scrape}/followers/");
}));
await Task.Delay(TimeSpan.FromSeconds(10));
//Select follower box
customBrowser.webView2.Invoke(new Action(async () =>
{
await customBrowser.webView2.ExecuteScriptAsync($"var box = document.querySelectorAll('div._aano');");
}));
int index = 0;
int lastIndex = 0;
int increment = 500;
while (index < 100)
{
customBrowser.webView2.Invoke(new Action(async () =>
{
await customBrowser.webView2.ExecuteScriptAsync($"box[0].scrollTop = {increment};");
index = int.Parse(await customBrowser.webView2.ExecuteScriptAsync("document.querySelectorAll('div._aarf._aarg').length;")) - 1;
}));
// Get names from lastIndex to index
if (index > lastIndex)
{
for (int i = lastIndex + 1; i <= index; i++)
{
// Click profile picture
customBrowser.webView2.Invoke(new Action(async () =>
{
await customBrowser.webView2.ExecuteScriptAsync($"var profile = document.querySelectorAll('div._aarf._aarg')[{i}]; profile.scrollIntoView();");
}));
await Task.Delay(TimeSpan.FromMilliseconds(random.Next(1521, 3526)));
customBrowser.webView2.Invoke(new Action(async () =>
{
await customBrowser.webView2.ExecuteScriptAsync($"profile.click();");
}));
await Task.Delay(TimeSpan.FromMilliseconds(random.Next(3000, 4567)));
// Like story
customBrowser.webView2.Invoke(new Action(async () =>
{
string response = await customBrowser.webView2.ExecuteScriptAsync("var likeButton = document.querySelector('span.x1i64zmx'); if (likeButton.children[0].children[0].children[0].children[0].getAttribute('aria-label') === 'Vind ik leuk') { likeButton.children[0].click(); }");
}));
await Task.Delay(TimeSpan.FromMilliseconds(random.Next(1000, 2000)));
// Exit story
customBrowser.webView2.Invoke(new Action(async () =>
{
await customBrowser.webView2.ExecuteScriptAsync("document.querySelector('div.xjbqb8w.x1ypdohk.xw7yly9.xktsk01.x1yztbdb.x1d52u69.x10l6tqk.x13vifvy.xds687c').children[0].click();");
}));
await Task.Delay(TimeSpan.FromMilliseconds(random.Next(1521, 3526)));
}
lastIndex = index;
}
await Task.Delay(TimeSpan.FromSeconds(random.Next(1, 3)));
increment += random.Next(500, 800);
}
customBrowser.BrowserStopped = true;
}
}
这种方法基本上就像 100 个 Instagram 故事,仅此而已。所以这基本上就是所有的代码。一个线程和一个浏览器成功执行并继续执行此操作。但是第二个线程似乎只在前几行(导航和打开关注者列表)工作,然后停止工作。这怎么可能?我只想模拟两个独立的隐身浏览器并在它们上运行脚本。就像我打开两个Chrome浏览器一样。Method4
Method4
答: 暂无答案
评论
Method4
private async Task Method4()
await Task.WhenAll([Your List of Tasks])