FluentScheduler任务挂起

时间:2017-01-26 13:05:45

标签: async-await fluentscheduler

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

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

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

所以我的问题是:在管道下的所有await语句中不调用configureAwait(false)会导致周期性挂起吗?如果是这样,为什么不是每次都挂起来?如果没有,任何想法可能导致我的任务挂起?

更新

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

1 个答案:

答案 0 :(得分:1)

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

  

如果没有,任何想法可能导致我的任务挂起?

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

  

使用SemaphoreSlim模式

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

相关问题