私のアプリケーションには以下のコードがあります。アプリケーションはWindowsServiceであり、DoSomethingInTheadingメソッドはサービスの開始後に起動されます。.NETスレッドファイナライザスレッドの問題
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スレッドの意味)によってクリアされるということでした。
私の質問は以下のとおりです。それは他のオブジェクトのために行うよう
- は、スレッドは、ファイナライザスレッドによって収集されていますか?
- 手動でクリーンアップスレッドを実装する必要はありますか? CLRはそれを気にしませんでしたか?
- 私はアプリケーションが.NET 3.5です。私はThreadPoolとTPLを先に進めることができますが、さまざまな理由で.NET 3.5に固執する必要があることを知っています。
何か提案/助けてください。
可能な重複[?我々は処分や使用後にC#でスレッドを終了する必要があります](http://stackoverflow.com/questions/10698107/do-we-need -to-dispose-or-terminate-a-thread-in-c-after-usage) – user3185569
これも読んで最初の質問に答えてください:http://stackoverflow.com/questions/3699147/c-sharp-thread -object-lifetime – user3185569
これはThreadPoolに適しています。それは.Net 3.5で利用可能ですが、それを使用しない理由は何ですか? – FloatingKiwi