任务并行库执行后代码未执行

时间:2015-07-22 11:02:57

标签: 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 =>
    {
        tasks[d] =
        Task.Factory.StartNew(() =>
        {
            ProcessPage();
        }, CancellationToken.None, 
           TaskCreationOptions.None,
           TaskScheduler.FromCurrentSynchronizationContext());
    });

    Task.WaitAll(tasks);

    Form2 frm = new Form2();
    frm.Show();                           
}

2 个答案:

答案 0 :(得分:1)

这很简单,你自己陷入僵局。

您通过TaskScheduler.FromCurrentSynchronizationContext()指示任务在当前同步上下文(即您的UI线程)上运行。 然后,你在主线程上Wait,同步阻止它。

相反,您可以异步等待:

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();
}

答案 1 :(得分:0)

你的任务之一可能会被卡住。由于您的WaitAll()

,所有任务完成后才会显示任何内容