1

我正在使用基于任务(TPL)的线程模型。启动我的应用程序 (WPF) 时,我注册TaskScheduler.UnobservedTaskException以显示一条消息。

但是,如果引发异常(例如Task.Factory.StartNew(() => throw new Exception());),则在引发UnobservedTaskException 事件之前需要相当长的时间(3-10 秒)。

我希望立即(或至少非常快)提出它,对这里可能出现的情况有任何想法吗?

问候

4

2 回答 2

2

这是因为该线程的终结器尚未运行。由于这发生在垃圾收集中,因此这是不确定的。此外,CLR 如何确定是立即抛出它还是您想检查任务的结果或调用Wait()并自己观察异常?

如果您启用 Break on First Chance Exceptions,它将在调试时抛出。

它将被传播回加入线程,保证。如果您使用的是 .NET 4.0,您的进程将终止。如果您使用的是 .NET 4.5,则不会

于 2012-09-12T14:12:25.360 回答
0

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
}

如果我直接调用ActivateItemAsyncsetter,那么我不能等待它,但是这样我可以等待它。

于 2021-10-07T12:27:02.093 回答