当调用方法获取垃圾时,变量生命周期是否在Action Queue内结束?

时间:2018-04-04 13:04:22

标签: c# .net api garbage-collection

我需要有关Action Queue中变量生命周期的建议 在多线程ASP.NET Web API环境中。

我的一个API接收更新数据库和发送电子邮件的请求。但是,发送电子邮件需要花费很长时间来处理,我决定使用下面的example将该部分包围在生产者/消费者队列中。

class TestDownload(unittest.TestCase):

    def setUpClass(cls):
        config.fs = True

但下面的代码是我不确定垃圾收集器是否会在UpdateTask完成时清理email_address的值。

Ran 0 tests in 0.004s

FAILED (errors=1)

Failure
Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.5/unittest/suite.py", line 163, in _handleClassSetUp
    setUpClass()
TypeError: setUpClass() missing 1 required positional argument: 'cls'

1 个答案:

答案 0 :(得分:0)

由于List是一个引用类型,一旦没有任何引用它就会被垃圾收集。您将列表传递给SendEmail方法,它将至少存在直到SendEmail结束(假设您没有在其他地方传递列表或将其存储在某个字段/属性中)。

更一般的指示:

但是,请注意通过访问多个线程中的列表来创建竞争条件。您也可以考虑使用ConcurrentQueue而不是Queue。

最后,如果这是ASP.NET应用程序代码的一部分,我会确保在响应请求之前完成队列,或者让我卸载长时间运行队列的服务(作业服务器概念)。我并不精通有关线程超过请求生命周期的风险,但我认为ASP可以搞乱它,导致在没有完成的情况下丢失排队的工作。