2016-08-11 15 views
0

私のアプリケーションには以下のコードがあります。アプリケーションは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スレッドの意味)によってクリアされるということでした。

私の質問は以下のとおりです。それは他のオブジェクトのために行うよう

  1. は、スレッドは、ファイナライザスレッドによって収集されていますか?
  2. 手動でクリーンアップスレッドを実装する必要はありますか? CLRはそれを気にしませんでしたか?
  3. 私はアプリケーションが.NET 3.5です。私はThreadPoolとTPLを先に進めることができますが、さまざまな理由で.NET 3.5に固執する必要があることを知っています。

何か提案/助けてください。

+0

可能な重複[?我々は処分や使用後にC#でスレッドを終了する必要があります](http://stackoverflow.com/questions/10698107/do-we-need -to-dispose-or-terminate-a-thread-in-c-after-usage) – user3185569

+0

これも読んで最初の質問に答えてください:http://stackoverflow.com/questions/3699147/c-sharp-thread -object-lifetime – user3185569

+0

これはThreadPoolに適しています。それは.Net 3.5で利用可能ですが、それを使用しない理由は何ですか? – FloatingKiwi

答えて

0

.Net 3.5ではまだThreadPoolが許可されています(TPLは許可されません)。スレッドを起動するには、単純に実行します。

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoSomethingElse) 
+0

ありがとう@FloatingKiwiあなたのリンクの多くは非常に便利です。とても有難い! – Sathishkumar