首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TaskScheduler.UnobservedTaskException -高架前的高延迟

TaskScheduler.UnobservedTaskException -高架前的高延迟
EN

Stack Overflow用户
提问于 2012-09-12 13:48:45
回答 2查看 383关注 0票数 1

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

但是,如果引发异常(e.g.Task.Factory.StartNew(() ) =>抛出新异常()),则引发UnobservedTaskException事件需要相当长的时间(3-10秒)。

我希望能立即(或至少很快)提出这一问题,对此有何看法?

问候

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-12 14:12:25

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

如果您启用了第一次机会异常的中断,它将在调试时被抛出。

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

票数 2
EN

Stack Overflow用户

发布于 2021-10-07 12:27:02

异步空方法总是在Dispatcher上引发异常,所以如果有一个返回Task的方法,您可以将它包装在异步空方法中,然后等待它。

我不得不这样做一次,因为我必须在属性设置器中调用一个异步方法(这是一个很好的理由,我不打算进入,但一般来说,这是一个糟糕的想法)

代码语言:javascript
运行
复制
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,那么我就不能等待它,但是这样我就可以等待它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12389708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档