[英]Exception in async methods is not caught
以下代码无法捕获我通过调用ct.ThrowIfCancellationRequested
引发的ct.ThrowIfCancellationRequested
。
public partial class TitleWindow : Window, IAsyncInitialization
{
public Task Initialization{get; private set;}
CancellationTokenSource cts;
public TitleWindow()
{
InitializeComponent();
cts = new CancellationTokenSource();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
cts.Cancel();
Initialization = GetCancelExceptionAsync(cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("Operation canceled!");
}
}
public async Task GetCancelExceptionAsync(CancellationToken ct)
{
await Task.Delay(1000);
ct.ThrowIfCancellationRequested();
}
}
但是,如果我用以下代码替换Window_Loaded
方法(使其异步并等待异步方法的调用),则会捕获异常。
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
cts.Cancel();
await GetCancelExceptionAsync(cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("Operation canceled!");
}
}
为什么我的第一种方法不起作用? 异常是否没有正确传播到正确的同步上下文?
我试图使用Stephen Clearys博客文章中描述The Asynchronous Initialization Pattern
,以便稍后等待在构造函数中启动的任务(并且为了使其与第二个示例具有可比性,我使用了( async
) Window_Loaded
事件马上等待那里的方法,例如上一个问题中向我建议的方法)。 然后,我想提供一个取消在构造函数中启动的异步方法的选项,由于异常处理无法按预期工作,因此我目前仍停留在该方法中。
使用我的“非工作”代码,我可以通过在某个地方的try-catch块中放置一个“ await Initialization
”来捕获该异常,但是我仍然会收到一个额外的未处理异常。
如何以一种允许我以后等待异步方法的方式实现此方法(以确保我不会处理对象的不一致状态),并且仍然能够取消该长时间运行的Task(当然,需要返回/设置默认值)?
Exeption被抛出另一个线程中的任务。
public async Task GetCancelExceptionAsync(CancellationToken ct)
{
try
{
await Task.Delay(1000);
ct.ThrowIfCancellationRequested();
}
catch (Exception e)
{
// your Cancleation expeption
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.