Backgroundworker Abbruch

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 78 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @Amelie Meine Fragen in Post #48, Deine Antworten in Post #49.
    Jeder Start Deines Programms braucht Verzeichnisse (von, nach) und Parameter (Kopie, Zip).
    Diese Daten schreibst Du in eine Text-Datei.
    Jede Zeile entspricht einem Start.
    Dann liest Du die Text-Datei zeilenweise aus.
    Du liest 2 Verzeichnisse und einen Satz Parameter und tust das, was da steht: Kopie von nach bzw. Zippen von nach.
    Und das ganze dan so lange, bis alle Zeilen der Textdatei abgearbeitet sind.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi

    @Amelie: Verstehe ich. Jeder fängt mal klein an. Über kurz oder lang kommst Du aber an APIs und COM Interfaces nicht vorbei da das .NET-Framework auch nicht alles abdeckt. Evtl. lehne ich mich jetzt auch zu weit raus wenn ich sage das im .NET-Framework sogar noch APIs verwendet werden, die nicht wirklich zur Windowsversion passen. Bestes Bsp ist die API SHBrowseForFolder die auch im NET-Framework für den BrowseForFolder-Dialog verwendet wird. Ab WinVista sollte man diese API nicht mehr verwenden, sagt MS sogar selber, und stattdessen das COM Interface IFileDialog. Soweit ich mich erinnere ist das aber noch nicht im NET-Framework enthalten und es wird immer noch der asbach alte Dialog von vor Vista angezeigt. Also wenn Du was modernes brauchst, musst du es selbst programmieren. :)
    Mfg -Franky-

    Amelie schrieb:

    Das kopieren als solches habe ich ja....
    Hast Du da jetzt zwei Programme, eines zum Kopieren, eines zum Zippen?
    Das geht doch All In One.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Nein nicht 2 Programme. Gugg mal in meinen ersten Beitrag, dahabe ich schon "kopiert & gezipt" in einem durchgang.
    Jetzt habe ich umgebaut auf Async ..
    Im Moment hänge ich da, wo ich die Progressbar einbinden kann...
    Ich habe die einzenlen Fils, die Anzahl der Files ... wie bekommt ich nun die Bar zum laufen?

    Ein Codeabschnitt aus der Kopierroutine

    VB.NET-Quellcode

    1. IO.Directory.CreateDirectory(mstrTempdir)
    2. For Each filename As String In Directory.GetFiles(classys.Source)
    3. If File.Exists(filename) Then
    4. Dim sourceFile As String = String.Empty
    5. Dim tempFilePath As String = String.Empty
    6. sourceFile = Path.GetFileName(filename)
    7. tempFilePath = mstrTempdir & "\" & sourceFile
    8. File.Copy(filename, tempFilePath, True)
    9. End If
    10. Me.Invoke(Sub() Result(filename & " von " & classys.countfiles & "Dateien wird kopiert"))
    11. Next
    12. MsgBox("Copy Successful", vbOKOnly, "Message")'<===== kommt später weg
    13. Else
    14. Me.Invoke(Sub() Result("blablabla."))
    15. ' Zip-Routine kommt später
    16. End If
    17. End Sub
    18. Private Sub Result(antwort As String)
    19. lbl_info.Text = (antwort)
    20. progbar.Visible = True
    21. progbar.Value += 1 '<========= hier hänge ich gerade...hmmm????
    22. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Im Moment hänge ich da, wo ich die Progressbar einbinden kann...
    Da sind wir wieder bei den einzelnen Dateien beim Zippen.
    Die Progressbar läuft im GUI-Thread, das Zippen in einem anderen Thread.
    Dieser andere Thread muss wie auch immer getaktet (Anzahl der Dateien, Anteil an der Speichergröße) ein Event an den GUI-Thread senden, dort kannst Du entsprechend des Wertes die Progressbar hochzählen.
    Wegen Trennung von GUI und Daten würde ich nicht im Zipp-Thread die Progressbar invoken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Amelie Befindet sich der Async-Code in derselben Klasse wie die Progressbar?
    Innerhalb einer Klasse kannst Du direkt eine Prozedur invoken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Amelie So was:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Label2.Text = "starte Berechnung"
    4. Button1.Enabled = False
    5. Await Threading.Tasks.Task.Run(Sub() DoAny())
    6. Label2.Text = "puh, endlich fertig"
    7. Button1.Enabled = True
    8. End Sub
    9. Private Sub DoAny()
    10. Dim x As Integer = 0
    11. For i = 1 To 50000000
    12. If i Mod 10000 = 0 Then
    13. Dim ac = New Action(Of Integer)(AddressOf Me.UpdateProgressbar)
    14. Me.Invoke(ac, x)
    15. x += 1
    16. End If
    17. Next
    18. End Sub
    19. Private Sub UpdateProgressbar(value As Integer)
    20. Label1.Text = value.ToString
    21. End Sub
    22. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So habe nun den BGW auf Async umgebaut und das mit dem " Abbruch " des Kopier,-Zip-Vorgangs und der Progressbar etc auch hinbekommen.
    Hier mal meine Kopierroutine. Ist bestimmt zu verbessern oder? :)

    countfiles kommt aus einer funktion und die Verzeichnisse speicher ich in den Einstellungen.
    Spoiler anzeigen

    Beispiel der Quelle.

    VB.NET-Quellcode

    1. Protected mstrSourcepath As String
    2. Public Property Source As String
    3. Get
    4. getToolsettings()
    5. Return mstrSourcepath
    6. End Get
    7. Set(value As String)
    8. If Len(value) >= 2 Then
    9. mstrSourcepath = value
    10. saveToolsettings()
    11. Else
    12. MessageBox.Show("Fehler,....")
    13. End If
    14. End Set
    15. End Property


    VB.NET-Quellcode

    1. Private Sub dowork()
    2. If classys.Zip = False Then
    3. Me.Invoke(Sub() Result("Daten werden kopiert."))
    4. Dim zaehler As Integer = 0
    5. IO.Directory.CreateDirectory(mstrTempdir)
    6. For Each filename As String In Directory.GetFiles(classys.Source)
    7. If File.Exists(filename) Then
    8. Dim sourceFile As String = String.Empty
    9. Dim tempFilePath As String = String.Empty
    10. sourceFile = Path.GetFileName(filename)
    11. tempFilePath = mstrTempdir & "\" & sourceFile
    12. File.Copy(filename, tempFilePath, True)
    13. End If
    14. Me.Invoke(Sub() Result(filename))
    15. Dim wert = New Action(Of Integer)(AddressOf Me.UpdateAusgaben)
    16. Me.Invoke(wert, zaehler)
    17. zaehler += 1
    18. If Abbruch = True Then
    19. Exit Sub
    20. End If
    21. Next
    22. Else
    23. Me.Invoke(Sub() Result("Daten werden gezippt."))
    24. 'Zip-Routine
    25. End If
    26. End Sub
    27. Private Sub UpdateAusgaben(werte As Integer)
    28. lbl_zaehler.Visible = True
    29. lbl_zaehler.Text = werte.ToString & " von " & classys.countfiles & " Dateien verarbeitet."
    30. Dim prozent As String = CStr(werte / CDbl(classys.countfiles) * 100.0)
    31. progbar.Visible = True
    32. progbar.Value = CInt(prozent)
    33. End Sub
    34. Private Sub Result(antwort As String)
    35. lbl_info.Text = (antwort)
    36. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @ErfinderDesRades Mag sein, aber invoken muss ich trotzdem:

    ====
    @Amelie Was soll das, numeerischen Weert in einen String und zurück in numerischen Wert konvertieren:

    VB.NET-Quellcode

    1. Dim prozent As String = CStr(werte / CDbl(classys.countfiles) * 100.0)
    2. progbar.Visible = True
    3. progbar.Value = CInt(prozent)
    ==>

    VB.NET-Quellcode

    1. progbar.Value = CInt(werte / CDbl(classys.countfiles) * 100.0)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nope

    VB.NET-Quellcode

    1. Imports System.Threading.Tasks
    2. Public Class FrmMain
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. TestTask().Start()
    5. End Sub
    6. Private Function TestTask() As Task
    7. Dim ProgressReporter As New Progress(Of Integer)(Sub(x) ReportProgress(x))
    8. Return New Task(Sub() TestJob(ProgressReporter))
    9. End Function
    10. Private Sub ReportProgress(x As Integer)
    11. Label1.Text = x.ToString
    12. End Sub
    13. Private Sub TestJob(ProgressReporter As IProgress(Of Integer))
    14. For i = 0 To 100
    15. ProgressReporter.Report(i)
    16. Next
    17. End Sub
    18. End Class

    Der Progress darf nicht im selben "Nebenläufigkeitsbereich" wie der Task selber laufen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RodFromGermany
    Ich bin mal wieder durcheinander gekommen mit "String" und "Integer" und dann schlug das VB diese Konvertierung vor.. grrr...

    @VaporiZed
    "Nebenläufigkeitsbereich" ????
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Nicht alles, was der vorschlägt, ist unbedingt richtig, noch weniger ist elegant. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    falsch verwendet
    Ich streue Asche auf mein Haupt.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim p As IProgress(Of Integer) = New Progress(Of Integer)(Sub(i)
    4. Label1.Text = i.ToString
    5. End Sub)
    6. Label2.Text = "starte Berechnung"
    7. Button1.Enabled = False
    8. Await Threading.Tasks.Task.Run(Sub() DoAny(p))
    9. Label2.Text = "puh, endlich fertig"
    10. Button1.Enabled = True
    11. End Sub
    12. Private Sub DoAny(p As IProgress(Of Integer))
    13. Dim x As Integer = 0
    14. For i = 1 To 500000000
    15. If i Mod 10000 = 0 Then
    16. p.Report(x)
    17. End If
    18. x += 1
    19. Next
    20. End Sub
    21. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!