我正在使用基于任务(TPL)的线程模型。启动我的应用程序 (WPF) 时,我注册TaskScheduler.UnobservedTaskException以显示一条消息。
但是,如果引发异常(例如Task.Factory.StartNew(() => throw new Exception());),则在引发UnobservedTaskException 事件之前需要相当长的时间(3-10 秒)。
我希望立即(或至少非常快)提出它,对这里可能出现的情况有任何想法吗?
问候
这是因为该线程的终结器尚未运行。由于这发生在垃圾收集中,因此这是不确定的。此外,CLR 如何确定是立即抛出它还是您想检查任务的结果或调用Wait()
并自己观察异常?
如果您启用 Break on First Chance Exceptions,它将在调试时抛出。
它将被传播回加入线程,保证。如果您使用的是 .NET 4.0,您的进程将终止。如果您使用的是 .NET 4.5,则不会
Async void 方法总是在 Dispatcher 上引发异常,因此如果您有一个返回 Task 的方法,您可以将它包装在 async void 方法中然后等待它。
我必须这样做一次,因为我必须在属性设置器中调用异步方法(有一个很好的理由,我不会进入,但通常这是一个坏主意)
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
}
如果我直接调用ActivateItemAsync
setter,那么我不能等待它,但是这样我可以等待它。