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,asynchronous,multithreading,async-await,c-5-0 来源: https://codeday.me/bug/20190718/1492169.html