c# – 异步等待块主UI

我正在使用新的async await功能从C#中的backgroundworker升级.在下面的代码中,我试图用ContinueWith方法复制多个任务的执行.

        Task t1 = new Task
        (
            () =>
            {
                Thread.Sleep(10000);

                // make the Task throw an exception
                MessageBox.Show("This is T1");
            }
        );

        Task t2 = t1.ContinueWith
        (
            (predecessorTask) =>
            {

                if (predecessorTask.Exception != null)
                {
                    MessageBox.Show("Predecessor Exception within Continuation");

                    return;
                }

                Thread.Sleep(1000);
                MessageBox.Show("This is Continuation");
            },

            TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.OnlyOnRanToCompletion
        );

        t1.Start();

        try
        {
           t1.Wait(); <------ Comment 
           t2.Wait(); <------ Comment 
        }
        catch (AggregateException ex)
        {
            MessageBox.Show(ex.InnerException.Message);
        }  

我的问题是当我评论t1.wait和t2.wait时任务没有阻止UI.但是当我取消注释t1.wait和t2.wait UI阻塞直到线程完成.期望的行为是在不阻止UI的情况下捕获try / catch块中的错误.我错过了什么?

最佳答案
如果这是在UI事件处理程序中运行,则可以将async修改器添加到方法签名并将t1.Wait()更改为等待t1.这将返回对UI线程的控制,并且当Thread.Sleep完成时,将继续执行继续,并且将捕获任何异常.

转载注明原文:c# – 异步等待块主UI - 代码日志