【问题标题】:.NET Thread Finalizer thread issue.NET 线程终结器线程问题
【发布时间】:2016-08-11 04:56:39
【问题描述】:

我的应用程序中有以下代码。该应用程序是一个 WindowsService,一旦服务启动,就会触发 DoSomethingInTheading 方法。

Public Sub DoSomethingInThreading()
    While True
    Dim completeEvent As New ManualResetEvent(False)
    Dim thread as Thread = New Thread(AddressOf DoSomeThingElse)
    If Not completeEvent.WaitOne(120000) Then
        Throw New SystemException("Issue in terminating")
    End If
    End While
End Sub

Public Sub DoSomeThingElse(Dim state as Object)
    Dim finishEvent as ManualResetEvent = DirectCast(state, ManualResetEvent)
    'Do I/O operation, this doesnt take more time (hardly in seconds)
    finishEvent.Set()
End Sub

现在,当我有大约 2500~3000 个线程时,一切似乎都很好。一旦它在此限制之后开始建立,我就会使应用程序内存不足,或者有时应用程序停止响应。我的假设是任务完成后线程将被 GC 清除(意味着在 Finalizer 线程中)。

我的问题是:

  1. Finalizer 线程是否像收集其他对象一样收集线程?
  2. 我是否需要手动执行任何清理线程?不会由 CLR 处理吗?
  3. 我的应用程序是 .NET 3.5。我知道我可以继续使用 ThreadPool 和 TPL,但由于各种原因,我需要坚持使用 .NET 3.5

任何建议/帮助 - 非常感谢。

【问题讨论】:

  • 另请阅读本文以回答您的第一个问题:stackoverflow.com/questions/3699147/…
  • 这非常适合线程池。它在 .Net 3.5 中可用,您不使用它的原因是什么?
  • 我同意@FloatingKiwi 的观点,我正在计划未来。但现在我必须忍受它:(
  • 我没有关注这个@Sathishkumar。您甚至可以在 .net2.0 中使用 ThreadPool。另一方面,TPL 仅在 .Net4 中可用,但您仍然可以在没有它的情况下使用 ThreadPool。

标签: vb.net multithreading garbage-collection .net-3.5 clr


【解决方案1】:

.Net 3.5 仍然允许 ThreadPool(它只是不允许 TPL)。要启动一个线程,只需执行以下操作:

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoSomethingElse)

【讨论】:

  • 感谢@FloatingKiwi,因为您的大多数链接都非常有用。非常感谢!
猜你喜欢
  • 2017-07-14
  • 2011-07-28
  • 2012-09-20
  • 2022-06-15
  • 2010-12-16
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多