Async abbrechen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Snaptu.

    Async abbrechen

    Moin Moin schon wieder...
    habe einen Async Task laufen, der wiederum Dateien kopiert.
    Wie breche ich einen Async Task ab?
    Habe bei MSDN folgende Zeile gefunden, jedoch funktioniert das so nicht...
    Problem ist meine Schleife, zumindest gehe ich davon aus...

    MSN Codezeile:

    VB.NET-Quellcode

    1. Me.BackgroundWorker1.CancelAsync()


    Meine Kopierfunktion:

    VB.NET-Quellcode

    1. Private Function FileCopy(ByVal file_source As String, ByVal file_destination As String) As String
    2. Try
    3. If File.Exists(file_destination) Then
    4. Return "Datei " & file_destination & " bereits vorhanden"
    5. Else
    6. If Directory.Exists(IO.Path.GetDirectoryName(file_destination)) Then
    7. File.Copy(file_source, file_destination, False)
    8. 'Return "Kopiert: " & IO.Path.GetFileName(file_source)
    9. Return "Kopiert: " & file_source
    10. Else
    11. Directory.CreateDirectory(IO.Path.GetDirectoryName(file_destination))
    12. File.Copy(file_source, file_destination, False)
    13. 'Return "Kopiert: " & IO.Path.GetFileName(file_source)
    14. Return "Kopiert: " & file_source
    15. End If
    16. End If
    17. Catch
    18. 'Return "Datei " & IO.Path.GetFileName(file_source) & " nicht gefunden"
    19. Return "Datei " & file_source & " nicht gefunden"
    20. End Try
    21. End Function


    Mein Button-Event mit Async:

    VB.NET-Quellcode

    1. Private Async Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    2. Button1.Enabled = False
    3. Button2.Enabled = False
    4. Button3.Visible = False
    5. Button4.Enabled = False
    6. DateiToolStripMenuItem.Enabled = False
    7. Button5.Visible = True
    8. For Each line In IO.File.ReadLines(OFD_source.FileName)
    9. If line.Contains("BRIEFE\") Then
    10. Dim line2 As String = CStr(line)
    11. Dim lastline As String = line2.Remove(0, line2.IndexOf("BRIEFE\"))
    12. Dim source2 As String = FBD_quelle.SelectedPath + "\" + lastline
    13. Dim destination2 As String = destination + "\" + lastline
    14. Dim return_copy As String = Await Task.Run(Function() FileCopy(source2, destination2))
    15. TextBox1.AppendText(return_copy & Environment.NewLine)
    16. status = status + 1
    17. End If
    18. Dim prozent As String = CStr(CInt(status / summe_verweise * 100.0))
    19. ProgressBar1.Value = CInt(status)
    20. lbl_von.Text = CStr(status)
    21. lbl_prozent.Text = prozent & " %"
    22. Me.Update()
    23. Next
    24. End Sub


    Wäre es ratsam hierfür die For Each Schleife in die Funktion zu setzen?

    Danke und Grüße,

    Stefan
    Nein! Doch! OHH!
    Du brauchst sowas hier

    VB.NET-Quellcode

    1. Public Cancel as Boolean = False
    2. 'mit einem Cancel Button stellst du auf True
    3. If Cancel then
    4. Dim Result As DialogResult
    5. Result = MessageBox.Show("Wollen sie wirklich abbrechen?", "Frage", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
    6. If Result = DialogResult.Yes Then
    7. Exit For
    8. End If
    9. End If


    Edit: mit User-Abfrage.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Snaptu“ ()

    samson schrieb:

    Geht das dann auch mit einer While Schleife?
    Tipp in solch einer Schleife ein Exit ein und sieh nach dem Leerzeichen, was die IDE Dir da anbietet:

    Das hättest Du experimentell wesentlich schneller rausbekommen. :D
    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!
    Nur um das ich es auch richtig verstanden habe... Snaptu sein Codefragment muss in die For Schleife... Korrekt?

    VB.NET-Quellcode

    1. If Cancel then
    2. Dim Result As DialogResult
    3. Result = MessageBox.Show("Wollen sie wirklich abbrechen?", "Frage", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
    4. If Result = DialogResult.Yes Then
    5. Exit For
    6. End If
    7. End If

    hab ich gemacht ;)
    Hat auch Funktioniert ;)
    Nuuuur... Wenn man auf "Nein" klickt, kommt die Meldung immer wieder erneut ;)
    Somit muss ich doch ebenfalls eine If Abfrage für DialogResult.No Then deklarieren mit Boolen False oder nicht?
    Nein! Doch! OHH!

    samson schrieb:

    Wenn man auf "Nein" klickt, kommt die Meldung immer wieder erneut
    Genau das macht der Code.
    Skizziere mal auf, wie sich Dein Code verhalten soll.
    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!
    Nur verzichte bitte bitte auf die Deppen-Messagebox.

    Ich denk immer, man denkt, ich sei voll-blöde, wenn eine Messagebox mich fragt, ob ich canceln möchte, wenn ich Cancel klickse.

    "Ja, was denkst du denn, warum ich Cancel klickse - etwa um einen Facebook-Account anzulegen?" :cursing:
    @ErfinderDesRades Ich hab es kurzerhand mit der Else Lösung gemacht.

    VB.NET-Quellcode

    1. cancel = false

    Damit kommt die Abfrage nur einmal.
    Ich muss gestehen, ich finde die Idee mit der Abfrage aber nicht so verkehrt, gerade was das Umkopieren der Daten angeht,...
    Ist mir persönlich schon passiert, (unter windoof), aus versehen weil ein Fenster auf und zu ging, genau den Abbrechen Button geklickt...
    Dumm gelaufen, eine Sicherheitsfrage wäre nicht schlecht gewesen :D
    Ich lass gerade einen Test laufen, bin gespannt was passiert, da ich den Kopiervorgang 2x unterbrochen hatte, wie sich die Progressbar verhält...
    Ob ich das dann resetten muss oder nicht...
    Wenn er die Pfaddatei von vorne anfängt, bekomm ich einen Überhang ;)
    Damit müsste ich ja den Kopiervorgang stoppen und alle Zähler auf 0 setzen :)
    Nein! Doch! OHH!

    samson schrieb:

    Damit müsste ich ja
    einen ordentlichen Plan machen, wie mein Programm ablaufen soll.
    Jou.
    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 ;) Den hab ich im Kopf :D
    Nein, ganz ehrlich, das Programm macht ja eigentlich nicht viel,...
    Es durchsucht eine Datei nach einem String, ist der Vorhanden, nimmt er den Pfad in der Zeile und kopiert dann die Datei von A nach B.
    Hat er das getan sucht er weiter in der Datei nach Pfaden :)
    Ablaufplan ist somit fast fertig.
    Nun ging es mir nur noch um das "saubere Abbrechen" des Vorgangs, man muss ja nicht immer mit aller gewalt auf das X oben rechts klicken ;)
    Nein! Doch! OHH!
    Wenn du die EDR-Aggressions Messagebox :D weglässt stellt sich die Frage des Else garnicht weil du kein DialogResult auswerten musst.
    Die Schleife läuft somit so lange bis du Cancel drückst.
    Dann genügt einfach

    VB.NET-Quellcode

    1. If Cancel then
    2. Exit For
    3. End If


    ausserhalb der For each setzt du wieder auf false
    Aber wie @RodFromGermany schon gesagt hat solltest du dir nen Plan machen also

    Schleife läuft
    Klick auf Cancel --> Aktion, Progressbar zurücksetzen
    keine Aktion --> Schleife läuft fertig
    Bei Fehler bei der abarbeitung --> Fehlermeldung
    usw,....
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    samson schrieb:

    Ich muss gestehen, ich finde die Idee mit der Abfrage aber nicht so verkehrt, gerade was das Umkopieren der Daten angeht,...
    Ist mir persönlich schon passiert, (unter windoof), aus versehen weil ein Fenster auf und zu ging, genau den Abbrechen Button geklickt...
    Dumm gelaufen, eine Sicherheitsfrage wäre nicht schlecht gewesen

    Ich weiß net.
    Also du hast da (offensichtlich) ein Fenster für einen umfangreichen Kopierauftrag.
    Dann startest du ihn, und daraufhin erscheint eine Progressbar, die langsam voll läuft, und ein Cancel-Button - beide vorher nicht zu sehen.

    Und dann gehen bei dir iwelche Fenster auf und zu, dass du vor Schreck auf den Cancel-Button klicksen musst?

    Also wenns so um dich bestellt ist, dann fürchte ich, wird auch eine "Sicherheitsfrage" keine zusätzliche Sicherheit bringen. ;)
    @ErfinderDesRades
    :D
    Nein, so schlimm ist es nicht... ich hab daheim nur 3 Monitore an meinem PC,.. ich war auf einem anderen Monitor was am arbeiten und der hat ne Meldung ausgegeben, bis ich mit dem Mauszeiger drüben war, ging die Meldung zu bevor ich geklickt hatte,... eine Sache von ein paar Millisekunden ;) Dummerweise war der OK Button genau über dem Abbrechenbutton von dem darunterliegenden Fenster ;) Demzufolge kam der Klick nicht bei dem Fenster an wo er hätte hin sollen :) Was solls... ist passiert ;)

    Aber mir ist gerade noch ein "Schönheitsfehler" aufgefallen...
    Wenn ich meine Pfaddatei geladen habe,... Liest er Async alle Pfade aus, damit ich eine Summe aller Daten habe,... (für den Progressbar)...
    Die ist unterschiedlich lang,... mal 3 digits mal 5 mal mehr...
    wie bekomm ich das hin, das die letzte Zahl immer am Ende des ProgressBar1 liegt?
    Danke und Grüße

    Nein! Doch! OHH!
    @Snaptu Jou.

    samson schrieb:

    macht ja eigentlich nicht viel
    Ich nehme an, die Betonung liegt auf eigentlich.
    Spätestens da solltest Du nen richtigen Plan entwerfen.
    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!
    ok ok, streichen wir das "eigentlich", es macht nicht viel... :D
    Hier mal der komplette Code :)
    Ich bitte um Beachtung, ich bin immernoch anfänger und lern mich noch ein :) wenn also optisch nicht alles in Ordnung ist und Ihr es ggf. anders gemacht hättet, bin ich für Verbesserungsvorschläge offen :)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Imports System.Threading.Tasks
    4. Public Class Form1
    5. Dim cancel As Boolean = False
    6. Public source As String
    7. Public destination As String
    8. Public re_copy As String
    9. Public filename As String
    10. Public bdt_file As String
    11. Public lastline As String
    12. Public summe_verweise As Integer = 0
    13. Public status As Integer
    14. Private Function FileCopy(ByVal file_source As String, ByVal file_destination As String) As String
    15. Try
    16. If File.Exists(file_destination) Then
    17. Return "Datei " & file_destination & " bereits vorhanden"
    18. Else
    19. If Directory.Exists(IO.Path.GetDirectoryName(file_destination)) Then
    20. File.Copy(file_source, file_destination, False)
    21. 'Return "Kopiert: " & IO.Path.GetFileName(file_source)
    22. Return "Kopiert: " & file_source
    23. Else
    24. Directory.CreateDirectory(IO.Path.GetDirectoryName(file_destination))
    25. File.Copy(file_source, file_destination, False)
    26. 'Return "Kopiert: " & IO.Path.GetFileName(file_source)
    27. Return "Kopiert: " & file_source
    28. End If
    29. End If
    30. Catch
    31. 'Return "Datei " & IO.Path.GetFileName(file_source) & " nicht gefunden"
    32. Return "Datei " & file_source & " nicht gefunden"
    33. End Try
    34. End Function
    35. Private Function read_bdt(ByVal bdt_file As String) As String
    36. Try
    37. For Each line In IO.File.ReadLines(bdt_file)
    38. If line.Contains("BRIEFE\") Then
    39. summe_verweise = summe_verweise + 1
    40. End If
    41. Next
    42. Return CStr(summe_verweise)
    43. Catch
    44. Return CStr("Kann die BDT Datei (" & bdt_file & ") nicht verarbeiten!")
    45. End Try
    46. End Function
    47. Private Async Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    48. OFD_source.ShowDialog()
    49. If OFD_source.FileName = "" Then
    50. MsgBox("Keine BDT Datei ausgewählt")
    51. Else
    52. Label1.Text = "Analysiere BDT Datei..."
    53. Dim summe_files As String = Await Task.Run(Function() read_bdt(OFD_source.FileName))
    54. Label1.Text = summe_files
    55. lbl_summe.Text = summe_files
    56. ProgressBar1.Maximum = CInt(summe_files)
    57. End If
    58. End Sub
    59. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    60. FBD_destination.ShowDialog()
    61. Dim destination As String = FBD_destination.SelectedPath
    62. Label4.Text = destination
    63. End Sub
    64. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    65. FBD_quelle.ShowDialog()
    66. Dim source As String = FBD_quelle.SelectedPath
    67. Label6.Text = source
    68. End Sub
    69. Private Async Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    70. cancel = False
    71. Button1.Enabled = False
    72. Button2.Enabled = False
    73. Button3.Visible = False
    74. Button4.Enabled = False
    75. DateiToolStripMenuItem.Enabled = False
    76. Button5.Visible = True
    77. For Each line In IO.File.ReadLines(OFD_source.FileName)
    78. If cancel Then
    79. Dim Result As DialogResult
    80. Result = MessageBox.Show("Wollen sie wirklich abbrechen?", "Frage", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
    81. If Result = DialogResult.Yes Then
    82. ProgressBar1.Value = 0
    83. lbl_von.Text = CStr("0")
    84. lbl_prozent.Text = CStr("0")
    85. Exit For
    86. Else
    87. cancel = False
    88. End If
    89. End If
    90. If line.Contains("BRIEFE\") Then
    91. Dim line2 As String = CStr(line)
    92. Dim lastline As String = line2.Remove(0, line2.IndexOf("BRIEFE\"))
    93. Dim source2 As String = FBD_quelle.SelectedPath + "\" + lastline
    94. Dim destination2 As String = destination + "\" + lastline
    95. Dim return_copy As String = Await Task.Run(Function() FileCopy(source2, destination2))
    96. TextBox1.AppendText(return_copy & Environment.NewLine)
    97. status = status + 1
    98. End If
    99. Dim prozent As String = CStr(CInt(status / summe_verweise * 100.0))
    100. ProgressBar1.Value = CInt(status)
    101. lbl_von.Text = CStr(status)
    102. lbl_prozent.Text = prozent & " %"
    103. Me.Update()
    104. Next
    105. End Sub
    106. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    107. cancel = True
    108. Button1.Enabled = True
    109. Button2.Enabled = True
    110. Button3.Visible = True
    111. Button4.Enabled = True
    112. DateiToolStripMenuItem.Enabled = True
    113. Button5.Visible = False
    114. End Sub
    115. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    116. lbl_prozent.BackColor = Color.Transparent
    117. End Sub
    118. Private Sub BeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BeendenToolStripMenuItem.Click
    119. Application.Exit()
    120. End Sub
    121. Private Sub LogdateiSpeichernToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles LogdateiSpeichernToolStripMenuItem.Click
    122. SaveFileDialog1.Filter = "txt(*.txt)| *.txt"
    123. SaveFileDialog1.ShowDialog()
    124. Try
    125. If SaveFileDialog1.FileName <> "Erfolgreich_kopiert.txt" Then
    126. FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output)
    127. PrintLine(1, TextBox1.Text)
    128. FileClose(1)
    129. End If
    130. Catch
    131. MsgBox("Datei wurde nicht gespeichert")
    132. End Try
    133. End Sub
    134. Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    135. AboutBox1.Show()
    136. End Sub
    137. End Class


    Der Button "Kopieren" liegt hinter dem Button "Kopieren stoppen" daher ist der 2. nicht sichtbar.
    Kopieren Stoppen wird als visible false geladen
    Bilder
    • Unbenannt.PNG

      10,67 kB, 482×607, 107 mal angesehen
    Nein! Doch! OHH!
    Also du hast einige Datentypen Probleme:

    Also der Schönheithalber gibt es einmal statt CStr -> .ToString und statt CInt -> Integer.Parse()

    Zeile 49 - Return CStr("Kann die BDT Datei (" & bdt_file & ") nicht verarbeiten!") -> Das ist alles String? wieso dann konvertieren? Return "Kann die BDT Datei" & bdt_file & "nicht verarbeiten!"
    Zeile 62 - ProgressBar1.Maximum = CInt(summe_files) -> Ist doch schon integer wieso dann konvertieren?
    Zeile 110 - Dim prozent As String = CStr(CInt(status / summe_verweise * 100.0)) -> Dim prozent As String = ((status / summe_verweise) * 100).ToString
    Zeile 93,94 - lbl_von.Text = CStr("0") - Is auch schon ein String? -> lbl_von.Text = "0"

    nur mal so als Beispiele...
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snaptu“ ()

    @Snaptu

    Zeile 49, hab ich vergessen zu ändern :saint:
    Zeile 93/94 hab ich ebenfalls vergessen :(

    Zeile 62, siehe Screenshot ;)

    Option Strict On möchte das nicht ^^
    aber geändert in ProgressBar1.Maximum = Integer.Parse(summe_files)

    Zeile 110 möchte Option Strict on ebenfalls nicht ;)
    geändert in Dim prozent As String = (status / summe_verweise * 100.0).ToString
    Nein! Doch! OHH!