0

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

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

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

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

更新

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

4

1 回答 1

1

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

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

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

使用 SemaphoreSlim 模式

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

于 2017-01-26T13:20:24.703 回答