【发布时间】:2019-04-17 20:35:00
【问题描述】:
嗨,我有这两个代码块
当我将浏览器导航到一个 url 并尝试等待它时,我认为我遇到了死锁=) 非常感谢任何帮助建议!
我只是在这里添加更多文字,以便我可以发布问题:/对不起
foreach (var davaType in davaTypes)
{
Parallel.ForEach(years, year =>
{
ts.Add(Task.Run(() =>
{
var th = new Thread(async () =>
{
await doWorkAsync(year, davaType, tarafType);
Application.Run();
});
th.IsBackground = true;
th.SetApartmentState(ApartmentState.STA);
th.Start();
}));
});
}
和
public static async Task doWorkAsync(int year, string davaType, string tarafType)
{
using (var browser = new MyBrowser())
{
Console.WriteLine("Im Created Here");
browser.Navigate("some url");
while (!browser.MyLoaded)
{
Console.WriteLine("waiting");
await Task.Delay(10);
}
Console.WriteLine("complete");
browser.Document?.GetElementById("DropDownList1")?.SetAttribute("value", davaType);
browser.Document.GetElementById("DropDownList3")?.SetAttribute("value", tarafType);
browser.Document.GetElementById("DropDownList4")?.SetAttribute("value", year.ToString());
browser.Document.GetElementById("Button1").MyClick();
await browser.WaitPageLoad(10);
Console.WriteLine("Im DoneHere");
}
}
【问题讨论】:
-
摆脱那些线程和 Task.Run 调用一个启动器。你一次混合了太多东西。
ts到底是什么?哦,为什么是Parallel.For?在我看来,您似乎想同时混合多种不同风格的异步/并发/并行。 -
我想做的是一次运行多个浏览器,将它们导航到 url 并进行报废
-
@Licentia 我不会按照您的建议那样做。不要使用 Web 浏览器控件,而是将网站数据下载为字符串,例如使用
var result = new System.Net.WebClient().DownloadString(url);。作为奖励,DownloadString()具有async风格,这将使您在清理代码后更轻松地使用tasks,正如 Peter 所建议的那样。 -
我知道这是我的第一个意图,但是网站中的发布请求被后端生成的密钥阻止,所以发布请求返回我的 url html :(
标签: c# winforms task-parallel-library