我使用的是基于任务(TPL)的线程模型。启动应用程序时,我注册TaskScheduler.UnobservedTaskException以显示消息。
但是,如果引发异常(e.g.Task.Factory.StartNew(() ) =>抛出新异常()),则引发UnobservedTaskException事件需要相当长的时间(3-10秒)。
我希望能立即(或至少很快)提出这一问题,对此有何看法?
问候
发布于 2012-09-12 14:12:25
这是因为该线程的终结器尚未运行。因为这是在垃圾收集中发生的,所以这种不确定性。此外,CLR如何确定是立即抛出它,还是希望检查任务的结果或调用Wait()
并亲自观察异常?
如果您启用了第一次机会异常的中断,它将在调试时被抛出。
它将被传播回连接线程,保证。如果您使用的是.NET 4.0,您的进程将终止。如果您使用的是.NET 4.5,则不会
发布于 2021-10-07 12:27:02
异步空方法总是在Dispatcher上引发异常,所以如果有一个返回Task的方法,您可以将它包装在异步空方法中,然后等待它。
我不得不这样做一次,因为我必须在属性设置器中调用一个异步方法(这是一个很好的理由,我不打算进入,但一般来说,这是一个糟糕的想法)
private T _activeItem;
public T ActiveItem
{
get => _activeItem;
set => ActivateItemAsyncVoid(value);
}
private async void ActivateItemAsyncVoid(T item)
{
await ActivateItemAsync(item);
}
public async Task ActivateItemAsync(T item, CancellationToken cancellationToken = default)
{
// Do stuff
}
如果我在setter中直接调用ActivateItemAsync
,那么我就不能等待它,但是这样我就可以等待它。
https://stackoverflow.com/questions/12389708
复制相似问题