C# 任务并行库执行后代码未执行
我有一个关于表单加载的逻辑,它使用并行库,运行良好。但在执行任务后,它不会打开表单。有人能帮忙吗C# 任务并行库执行后代码未执行,c#,asp.net,parallel-processing,async-await,task-parallel-library,C#,Asp.net,Parallel Processing,Async Await,Task Parallel Library,我有一个关于表单加载的逻辑,它使用并行库,运行良好。但在执行任务后,它不会打开表单。有人能帮忙吗 private void Form1_Load(object sender, EventArgs e) { Task[] tasks = new Task[3]; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); dummyList.ForEach(d => {
private void Form1_Load(object sender, EventArgs e)
{
Task[] tasks = new Task[3];
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
dummyList.ForEach(d =>
{
tasks[d] =
Task.Factory.StartNew(() =>
{
ProcessPage();
}, CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
});
Task.WaitAll(tasks);
Form2 frm = new Form2();
frm.Show();
}
你的一项任务可能被卡住了。由于您的
WaitAll()
原因,在所有任务完成之前,不会显示任何内容。这很简单,您正在死锁自己
您正在通过TaskScheduler.FromCurrentSynchronizationContext()
指示任务在当前同步上下文(即UI线程)上运行。
然后,在主线程上等待,同步地阻塞它
相反,您可以异步等待:
private async void Form1_Load(object sender, EventArgs e)
{
var tasks = dummyList.Select(() => Task.Run(() => ProcessPage());
await Task.WhenAll(tasks);
var form = new Form2();
form.Show();
}
即使我删除了waitall(),它仍然没有打开表单感谢响应,但我还需要TaskScheduler.FromSynchronizationCurrentContext(),因为在任务中我使用webbrowser控件。需要Task.Factory.startnew如果根本不打开新任务,则必须同步运行它们。或者,将可以通过后台完成的部分拆分,然后在UI线程上完成其余部分。如果新任务都需要在UI线程上执行,那么启动新任务是毫无意义的。实际上,我正在抓取一个网站,它需要webbrowser来获取javascript内容,并且需要Task.Factory来处理多个页面。StartNew@AmanKhanna也许可以向我们展示
ProcessPage
中的代码,所以我可以看到你在那里做什么。@AmanKhanna web scraping不需要WebBrowser控件,只需使用HttpClient或HttpWebRequest向目标站点发出HTTP请求并读取响应即可。