【发布时间】: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 线程中)。
我的问题是:
- Finalizer 线程是否像收集其他对象一样收集线程?
- 我是否需要手动执行任何清理线程?不会由 CLR 处理吗?
- 我的应用程序是 .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