我正在使用FluentScheduler 3.1.42,它似乎不支持异步作业。
我们有一些使用.Wait()执行异步代码的任务。它们运行良好并且从未导致任务挂起,尽管所有等待语句都没有使用ConfigureAwait(false)。
我添加了一个更复杂的新任务,可以进行多个等待并使用带有SemaphoreSlim模式的WhenAll。此任务通常有效,但偶尔会挂起(大约一周只有两次,并且计划在2台服务器上每5秒运行一次),直到我重新启动Web服务器。
所以我的问题是:在管道下的所有await语句中不调用configureAwait(false)会导致周期性挂起吗?如果是这样,为什么不是每次都挂起来?如果没有,任何想法可能导致我的任务挂起?
更新
我更新了我的代码来处理信号量苗条以及正在使用的smtp对象,这似乎已经解决了这个问题。我做了还添加了对configureAwait的显式调用以获得良好的测量,并且在信号量try / finally中包含更少的等待,因为我不需要像以前那样限制并发性。不完全确定究竟发生了什么,但它似乎不再发生了,所以这很酷。
答案 0 :(得分:1)
可能没有上下文(SynchronizationContext.Current
/ TaskScheduler.Current
与TaskScheduler.Default
不同),如果这是正确的,那么您可能不需要{ {1}}。
如果没有,任何想法可能导致我的任务挂起?
当然,没有代码,任何答案都是完整的猜测,但如果我不得不猜测......
使用SemaphoreSlim模式
我的猜测是你的代码没有发布ConfigureAwait(false)
。例如,如果您忘记将SemaphoreSlim
包装在Release
块中,则异常将导致信号量保持锁定状态。