.NET Thread Finalizer 线程问题
.NET Thread Finalizer thread issue
我的应用程序中有以下代码。该应用程序是一个 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
任何 suggestions/helps - 非常感谢。
.Net 3.5 仍然允许 ThreadPool(它只是不允许 TPL)。要启动线程,只需执行以下操作:
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoSomethingElse)
我的应用程序中有以下代码。该应用程序是一个 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
任何 suggestions/helps - 非常感谢。
.Net 3.5 仍然允许 ThreadPool(它只是不允许 TPL)。要启动线程,只需执行以下操作:
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoSomethingElse)