BackgroundWorker

MikeBi

Mitglied
Hallo,

Ich habe ein Problem mit dem BackgroundWorker. Wenn ich den ersten Text ins Logfile schreibe, wird zwar das schreiben des Logfles ordentlich durchgeführt, aber das Ereignis RunWorkerCompleted wird nicht ausgelöst . Außerdem ist Logfile_BW.IsBusy immer noch gesetzt. In das Logfile wird von verschiedenen Threads geschrieben. Hat jemend eine Idee was ich falsch mache oder eine Idee wie ich teilweise schnell aufeinander folgene Einträge in ein Logfile schreiben kann. Ich habe den Code mal vereinfacht.


Code:
    Private WithEvents Logfile_BW As New BackgroundWorker
    Dim Logfile_Buffer As String

    Sub Logfile(ByVal Text As String)
        If Not Logfile_BW.IsBusy Then
            Logfile_BW.RunWorkerAsync(Text)
        Else
            'Text in Logfile_Buffer
        End If
    End Sub

    Private Sub Logfile_BW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Logfile_BW.DoWork
        'Schreibe Text ins Logfile
    End Sub

    Private Sub Logfile_BW_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles Logfile_BW.RunWorkerCompleted
        If Not IsNothing(Logfile_Buffer) Then
            Dim Text As String = Logfile_Buffer
            Logfile_BW.RunWorkerAsync(Text)
            Logfile_Buffer = Nothing
        End If
    End Sub


Danke für Eure Ideen.

Mike
 
Hallo Mike,

wenn das RunWorkwerCompleted-Event nicht aufgerufen wird, ist es entweder nicht abonniert oder DoWork wurde nicht beendet. Hier solltest du nochmal den entsprechenden Code unter die Lupe nehmen. Weiterhin halte ich es für keine so gute Idee, den Background-Worker im Completed-Event immer wieder neu zu starten. Ich würde alle Log-Einträge in eine Queue schreiben, die dann innerhalb des Threads (DoWork) in einer permanenten Schleife ausgelesen wird.

Gruß
MCoder
 
Hallo,

also die DoWork Routine wird komplett durchlaufen. Das habe ich mit Tests kontrolliert.
Das Ereignes Completed habe ich sogar nochmal extra zum Test beim Aufruf mit AddHandler abboniert. Leider kein Unterschied.
Verstehe ich Deinen Ansatz richtig., das Du den BackgroundWorker die ganze Zeit laufen lassen würest. Aber Du kannst doch nicht eine geöffnete datei noch einmal öffnen, um etwas hinein zu schreiben. Ich möchte auch nicht die Datei die ganze Zeit geöfnet halten. Hast Du eventuell ein paar CodeSchnipsel für mich.

Mike
 
Hallo Mike,

für das Problem mit dem Backgroundworker habe ich momentan keine Erklärung.

Ich habe meinen Vorschlag mit der Queue mal kurz skizziert. Ich hoffe, der Code passt so einigermaßen; ich programmiere sonst nur mit C#. Da du damit keine Events brauchst, kannst du statt des Backgroundworkers einen Thread aus dem Threadpool verwenden.
Visual Basic:
Imports System
Imports System.Collections.Generic
Imports System.Threading
 
Namespace Logging
    Public Class LogFile
        Private m_LogQueue As Queue<string> = New Queue<string>() 
        Private m_Run As Boolean =  False 
 
        Private Shared m_Lock As Object =  New Object() 
 
        Public Sub Start()
            If Not m_Run
                m_Run = True
                ThreadPool.QueueUserWorkItem(New WaitCallback(ProcessingQueue),Nothing)
            End If    
        End Sub
        
        Public Sub Stop()
            m_Run = False
        End Sub
 
        Public Sub Write(String str)
            lock(m_Lock) ' Wie in VB ?
            {
                m_LogQueue.Enqueue(str) 
            }
        End Sub
        
        Private Sub ProcessingQueue(Object Parameter)
            while(m_Run) ' Wie in VB ?
            {
                If m_LogQueue.Count > 0 )
                    Dim str As String
 
                    lock(m_Lock) ' Wie in VB ?
                    {
                        str = m_LogQueue.Dequeue()
                    }
 
                    ' TODO: Datei öffnen
                    ' TODO: In Datei Schreiben
                    ' TODO: Datei schließen
                End If
                Thread.Sleep(10)
            }
        End Sub
    End Class
End Namespace
Gruß
MCoder
 
Zuletzt bearbeitet:
Zurück