Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务并行库执行后代码未执行_C#_Asp.net_Parallel Processing_Async Await_Task Parallel Library - Fatal编程技术网

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请求并读取响应即可。