我使用的是FluentScheduler 3.1.42,它似乎不支持异步作业。
我们有几个使用.Wait()执行异步代码的任务。它们运行良好,从未导致任务挂起,尽管所有等待语句都没有使用ConfigureAwait(false)。
我添加了一个更复杂的新任务,它执行多个等待,并将WhenAll与SemaphoreSlim模式结合使用。此任务通常有效,但偶尔挂起(大约一周内只挂两次,计划每5秒在2台服务器上运行),直到我重新启动web服务器为止。
因此,我的问题是:周期性挂起是否是由于在管道中所有等待语句上不调用configureAwait(false)造成的?如果是的话,为什么不每次挂起来呢?如果没有,你知道是什么原因导致我的任务挂起吗?
更新
我更新了我的代码来释放slim信号量和一个正在使用的smtp对象,这似乎解决了这个问题。我还添加了对configureAwait的显式调用,以获得更好的度量,并且在信号量尝试/最后封装了更少的等待,因为我不需要限制代码的并发性。不完全确定到底发生了什么,但似乎已经不再发生了,所以这很酷。
发布于 2017-01-26 13:20:24
可能没有上下文(SynchronizationContext.Current / TaskScheduler.Current与TaskScheduler.Default不同),如果这是正确的,那么您可能不需要ConfigureAwait(false)。
如果没有,你知道是什么原因导致我的任务挂起吗?
当然,如果没有密码,任何答案都是完全的猜测,但如果我不得不猜测.
使用SemaphoreSlim模式
我猜您的代码没有发布SemaphoreSlim。例如,如果您忘记将Release封装在finally块中,那么异常将导致信号量被锁定。
https://stackoverflow.com/questions/41874112
复制相似问题