2016-09-26 7 views
0

私は、ディレクトリ内のファイルを同時に処理できるvbでマルチスレッドプログラムを作成しなければなりませんでした。 問題は数時間は正常に動作することです。 3つのスレッドisAliveメソッドがすべて "true"の値で返されるため、突然 "Thread.Sleep(500)"に突き当たりますが、 "StartSub"はすべてのスレッドで終了します。コードが間違っているのか、それとも問題になるのでしょうか?コード終了後にスレッドがまだ生きていることがあります

Basicalyプログラムは、次のようなものです:

private sub main() 
    importThread = New Thread(AddressOf StartSub) 
    importThread2 = New Thread(AddressOf StartSub) 

    for each file in directory 
       While True 
        If importThread.IsAlive And importThread2.IsAlive Then 
         Thread.Sleep(500) 
        Else : Exit While 
        End If 
       End While 

       If importThread.IsAlive Then 
        importThread2 = New Thread(AddressOf StartSub) 
        importThread2.IsBackground = True 
        importThread2.Start() 
       Else 
        importThread = New Thread(AddressOf StartSub) 
        importThread.IsBackground = True 
        importThread.Start() 
       End If 
    next 
End sub 

Private Sub StartSub(ByVal tp As Object) 
     'Read fileinfo and process it for something 
end Sub 
+0

各ディレクトリに2つの新しいスレッドを開始します。生のスレッドを使用するのではなく、TasksとTPLを使用することをお勧めします。これにより、スレッドやオブジェクトの代わりに適切なメソッドを使用し、タスクを 'await'や' ContinueWith'などと組み合わせることができます。並列に各フォルダを処理するために 'Parallel.ForEach'を使うこともできます。 –

+0

ありがとうございます私のコード/思考の問題。メソッドの処理が完了しても、両方のスレッドはまだ生きていますが、なぜ何時間も働いていますか?問題を理解することでマルチスレッド化が進んでいます。 – user3219009

+0

まず、「StartSub」にコードを投稿しないと誰が知ることができますか?しかし、フォルダごとに2つのスレッドを起動し、* last *繰り返しで作成されたものだけをチェックするような明白な問題があります。ゴーストスレッドを生成しなかったとしても、コードは常に「StartSub」メソッドの1つが終了するのを待ちます。そうでない場合、ループは終了しません。 –

答えて

0

スレッドの処理がガベージコレクタはアラカルトに終了したスレッドによって残されたスレッドリソースを取る、良かったようです。プログラムがスタックした理由は、スレッドがフォームコントロールから情報を回復し、フォームのコントロールが起動しても反応しないことがあるためです。これでスレッドがハングアップしました。

関連する問題