【问题标题】:FluentScheduler task hangsFluentScheduler 任务挂起
【发布时间】:2017-01-26 13:05:45
【问题描述】:

我使用的是 FluentScheduler 3.1.42,它似乎不支持异步作业。

我们有一些使用 .Wait() 执行异步代码的任务。尽管所有等待语句都没有使用 ConfigureAwait(false),但它们运行良好并且从未导致任务挂起。

我添加了一个更复杂的新任务,它执行多个等待,并将 WhenAll 与 SemaphoreSlim 模式一起使用。此任务通常有效,但偶尔会挂起(大约一周内只有两次,并且计划在 2 台服务器上每 5 秒运行一次),直到我重新启动 Web 服务器。

所以我的问题是:周期性挂起是否是由于未对管道中的所有等待语句调用 configureAwait(false) 引起的?如果是这样,为什么它不是每次都挂起?如果没有,知道什么可能导致我的任务挂起吗?

更新

我更新了我的代码以处理信号量 slim 以及一个正在使用的 smtp 对象,这似乎已经解决了这个问题。我确实还添加了对 configureAwait 的显式调用以获得良好的度量,并在信号量 try/finally 中包装了更少的等待,因为我不需要像以前那样限制代码的并发性。不完全确定到底发生了什么,但它似乎不再发生了,所以这很酷。

【问题讨论】:

    标签: async-await fluentscheduler


    【解决方案1】:

    可能没有上下文(SynchronizationContext.Current / TaskScheduler.CurrentTaskScheduler.Default 不同),如果这是正确的,那么您可能不需要 ConfigureAwait(false)

    如果没有,知道是什么导致我的任务挂起吗?

    当然,没有代码,任何答案都是完全猜测,但如果我不得不猜测......

    使用 SemaphoreSlim 模式

    我的猜测是您的代码没有发布SemaphoreSlim。例如,如果您忘记将 Release 包装在 finally 块中,则异常会导致信号量保持锁定状态。

    【讨论】:

    • 嗨,斯蒂芬,该版本包含在 finally 中,所以那里应该很好。我会看到一些代码来帮助推断发生了什么。顺便说一句,感谢您关于该主题的博客 - 它们帮助排除了一些潜在问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多