ciao.
Ho due background worker uno che si deve attivare ogni 10 sec e uno ogni 50 sec.
e devosincronizzarli , ho pensato di usare un semaforo , dichiarato come shared(vb.net) in un wrapper attorno al background worker.
posto subito il codice un po semplificato:
e il primo ogni 50 sec:codice:'Background worker ogni 10 sec Public Class BWSpooler Dim bw As BackgroundWorker = New BackgroundWorker Public Sub New() bw.WorkerSupportsCancellation = True bw.WorkerReportsProgress = True AddHandler bw.DoWork, AddressOf DoWork 'AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted End Sub Private Sub DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Try Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) Dim i As Integer For i = 1 To 10 If bw.CancellationPending = True Then e.Cancel = True Exit For Else Threading.Thread.Sleep(10000) BWScheduler.mainCount += 1 Try BWScheduler.semap.Release() Catch End Try end sub end class
ora , ho provato col try catch nelcodice:Public Class BWScheduler Dim bw As BackgroundWorker = New BackgroundWorker Public Shared semap As New System.Threading.Semaphore(0, 1) Public Shared releaseCount As Integer = 0 Public Shared mainCount As Integer = 0 Private n As Integer = 0 Public Sub New() AddHandler bw.DoWork, AddressOf bw_DoWork 'AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted End Sub Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Try Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) Dim i As Integer For i = 1 To 10 If bw.CancellationPending = True Then e.Cancel = True Exit For Else BWScheduler.semap.WaitOne() ' Perform a time consuming operation and report progress. System.Threading.Thread.Sleep(50000) BWScheduler.releaseCount += 1 next end sub end class
e dopo la prima volta mi da un errore , ho provato a mettere nel catch un BWScheduler.semap.WaitOne() ma dopo mi si interrompe il thread.codice:Try BWScheduler.semap.Release() Catch End Try
ho tntato di fare questo per sincronizzare i due background worker.
Ho anche provato a mettere in ciascun backround worker un BWScheduler.semap.WaitOne() all'inizio e un release alla fine ma cosi devo aspettare il bw piu lento e non funziona come vorrei .
ps. voglio sincronizzare pperchè i due bw nell'applicazione reale lavorano sulle stesse risorse e non voglio sovrapposizioni o casini di ogni genere
grazie.

Rispondi quotando