1

私は VB.Net で作業しており、一方のスレッドが終了するのを待っている間、一方のスレッドを一時停止する必要があります。

私は非常に近い質問を見てきましたが、それを理解できないようです(そして、バックグラウンドワーカーの一時停止/再開ループの投稿にコメントできませんでした)

私のシナリオは、2 人のバックグラウンド ワーカーがいるというものです。Worker1 は、ファイルを処理する Worker2 に fileNames を渡しています。Worker2 が終了していない場合は、Worker1 を一時停止する必要があります。つまり、Worker1 は Worker2 が終了した後にのみ次の fileName を解放します

これを行う方法についてのアイデアはありますか?

@ user1666788 からのコメントの後の作業コード

以下のコードは、先に進む前に一方が他方の作業を終了するまで待機する必要がある、上記の 2 つのバックグラウンド ワーカーのシナリオ用です。

Dim isFinished as boolean
Dim currentFiile as integer

Private Sub StartWork_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartWork.Click
    bgWorker1.WorkerSupportsCancellation = True
    isFinished = True
    currentFile = 0
    bgWorker1.RunWorkerAsync()
End Sub

Private Sub bgWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker1.DoWork
    If isFinished = False Then
        bgWorker1.CancelAsync()
    End If
    isFinished = False
    For i = currentFile To fileNames.Count - 1
        Dim fileName As String = fileNames(i)
        LoadRules(myValidator.GetFileType(fileName))
        If i = fileNames.Count Then bgWorker1.CancelAsync()
        Exit Sub
    Next
End Sub

Private Function LoadRules(ByVal fileType As String) As Boolean
    ' Function to load some rules for file processing
    Try

        ' Start Thread for actual file processing using bgworker2
        bgWorker2.WorkerSupportsCancellation = True
        bgWorker2.RunWorkerAsync()
        Return True
    Catch ex As Exception

    End Try
End Function

Private Sub bgWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker2.DoWork

    Try

         ' Do your thing here
         ' for x is 0 to 1million
         ' next

        ' Mark is finished to true
        isFinished = True

        ' Set currentFile
        currentFile += 1

        ' The bgWorker1 is restarted when bgWorker2 has finished.
        ' Note however that bgWorker1 will "Continue" where it left off due to the property "currentFile"
        bgWorker1.RunWorkerAsync()

        '++++++++++++++++++++++++++++++++++++
    Catch ex As Exception

    End Try
End Sub

ほらね。期待どおりに動作します。ファイルが完全に作成された後に別のプロセスを開始できるように、ファイルをディスクに書き込む進行状況を「監視」する方法を理解する必要があります.....

4

1 に答える 1

1

これと同様の問題がありました。私がVSから言われたことから、それはできません。ただし、使用されなくなったスレッドを一時停止/再開するためのサブルーチンを回避する方法を見つけました。

最も簡単な方法は、進行状況を確認することです。進行状況がまだ機能している場合は、通話を終了します。以下に例を示します。S1 を最初のスレッド、S2 を 2 番目のスレッドとします。

sub S1()

if(processingfile)then exit sub

'Insert code here for sending next file for processing

end sub

sub S2()
processingfile = true

'Insert code for processing files

processingfile = false

end sub

それは多かれ少なかれ、私が問題を回避した方法です。私のアドバイスが役に立てば幸いです:)

ああ、もう 1 つ、ファイルが処理中かどうかを確認する前に、最初のスレッドをスリープさせて、大量の CPU パワーを使い切らないようにすることをお勧めします。しかし、それは単なる推測です。短い睡眠期間なしで試したことはありません

于 2012-09-18T21:25:49.550 に答える