Programmablauf abbrechen

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

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Programmablauf abbrechen

    Moin moin

    Ich bin wieder bei meinem Programm und suche nun nach der " besten / saubersten " Lösung wie ich den Programmablauf unterbrechen kann. Eigentlich nicht notwendig aber ich habe gelesen, das man immer Programmabschnitte auch "Abbrechen" können muss.
    Habe es im Moment so gelöst. Wäre für bessere Lösungen dankbar.


    Pseudocode
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim Abort As Boolean = False
    2. Private Sub Btn_Abbruch_Click(sender As Object, e As EventArgs) Handles Btn_Abbruch.Click
    3. Mainclass.Abort = True
    4. End Sub
    5. Private Async Sub Tueetwas()
    6. 'Zur Sicherheit nochmal auf FALSE
    7. Mainclass.Abort = False
    8. Await Threading.Tasks.Task.Run(Sub() TueNochetwas())
    9. 'Todo's nach Beenden oder nach Abbruch
    10. If Mainclass.Abort Then
    11. AfterAbort()
    12. Else
    13. AfterDo()
    14. End If
    15. End Sub
    16. Private Sub TueNochetwas()
    17. If Mainclass.IsDriveReady(Mainclass.Laufwerk) Then
    18. Dim Root = Mainclass.HDDS
    19. Mainclass.PutFilesIntoListBoxFrom(New IO.DirectoryInfo(Mainclass.Laufwerk.ToString), Mainclass.Fileextension)
    20. For Each Datei In Mainclass.TargetFiles
    21. If Mainclass.Abort Then Exit Sub
    22. Try
    23. 'some Code
    24. 'some Code
    25. 'some Code
    26. Catch UAEx As UnauthorizedAccessException
    27. Mainclass.ExceptionToFile(UAEx.ToString)
    28. Mainclass.ErrorHandling()
    29. End Try
    30. 'some Code
    31. 'some Code
    32. Next
    33. End If
    34. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    EDIT: 14:55 UHR
    -------------------------------------


    Habe es hinbekommen. So wir die Suche abgebrochen, wie ich es mir vorstellte.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim cToken As CancellationTokenSource = New CancellationTokenSource()
    2. Dim token As CancellationToken = cToken.Token
    3. Private Sub Frm_Mainform_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. 'Zum Test mal fixgesetzt
    5. Mainclass.CurrentDrive = "Y:\"
    6. Mainclass.Fileextension = "*.jpg"
    7. End Sub
    8. Private Async Sub Btn_Suchen_Click(sender As Object, e As EventArgs) Handles Btn_Suchen.Click
    9. Mainclass.TargetFiles.Clear()
    10. Mainclass.InaccessibleDirectories.Clear()
    11. cToken = New CancellationTokenSource
    12. Await Task.Run(Sub() SearchFiles(cToken.Token), token)
    13. End Sub
    14. Private Sub Btn_Abbruch_Click(sender As Object, e As EventArgs) Handles Btn_Abbruch.Click
    15. cToken.Cancel()
    16. End Sub
    17. #Region "FilsSearch"
    18. Private Sub SearchFiles(cToken As CancellationToken)
    19. If Mainclass.IsDriveReady(Mainclass.CurrentDrive) Then
    20. Try
    21. Me.BeginInvoke(Sub() Me.Cursor = Cursors.WaitCursor)
    22. Dim Root = Mainclass.HDDS
    23. Mainclass.PutFilesIntoListBoxFrom(New IO.DirectoryInfo(Mainclass.CurrentDrive.ToString), Mainclass.Fileextension)
    24. cToken.ThrowIfCancellationRequested()
    25. Me.BeginInvoke(Sub() LstBox_Searchfiles.Items.AddRange(Mainclass.TargetFiles.Select(Function(x) x.FullName).ToArray))
    26. Me.BeginInvoke(Sub() Lbl_Response.Visible = True)
    27. Me.BeginInvoke(Sub() Lbl_Response.Text = (Language.CountFoundFiles & LstBox_Searchfiles.Items.Count))
    28. If LstBox_Searchfiles.Items.Count = 0 Then
    29. Me.BeginInvoke(Sub() Lbl_Response.Visible = True)
    30. Me.BeginInvoke(Sub() Lbl_Response.Text = (Language.CountFoundFiles & LstBox_Searchfiles.Items.Count))
    31. Me.BeginInvoke(Sub() Btn_Suchen.Enabled = True)
    32. Me.BeginInvoke(Sub() Me.Cursor = Cursors.Default)
    33. Else
    34. Me.BeginInvoke(Sub() Me.Cursor = Cursors.Default)
    35. End If
    36. Catch ex As Exception
    37. Me.BeginInvoke(Sub() Me.Cursor = Cursors.Default)
    38. Mainclass.ExceptionToFile(ex.Message)
    39. Mainclass.ErrorHandling()
    40. Exit Sub
    41. Finally
    42. 'Zum TEST einbe MsgBox
    43. MessageBox.Show("Abbruch durch Benutzer")
    44. End Try
    45. Else
    46. Mainclass.ExceptionToFile(Language.DeviceErr)
    47. Mainclass.ErrorHandling()
    48. End If
    49. End Sub



    toteditierten Beitrag wiederhergestellt ~VaporiZed
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VaporiZed“ ()

    @Amelie Was soll der Unsinn?
    Du machst eine Async Methode und invokst jede Zeile Deines Codes.
    Mach da eine synchrone Methode draus und sie läuft wesentlich schneller.
    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 Sammle die komplette Information nebenläufig ein und stelle sie im GUI-Thread dar. Da dürfte dann nix mehr einfrieren.

    VB.NET-Quellcode

    1. Mainclass.PutFilesIntoListBoxFrom(New IO.DirectoryInfo(Mainclass.CurrentDrive.ToString), Mainclass.Fileextension)
    Ist das die einzige Zeile, die tatsächlich nebenläufig arbeitet?
    Kannst Du mal die komplette Klasse, sofern allein lauffähig, posten?
    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!
    In dem Teil meines Programms ja.
    Es sind eigentlich nur noch eine Combobox für Dateiendungen und ein Treeveiw für die Laufwerksauswahl.

    Das "suchen und auflisten" hier ist nur ein Teil.
    In einem anderen Teil wird dann auch mit Await gezippt.
    Sogeshen funktioniert ja alles. Wollte jetzt nur noch ein paar Feinheiten machen. Wie das Abbrechen ...
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Wie gesagt ja soweit funktioniert das "suchen" und das "zippen", "löschen" so wie ich mir das vorstellte. ;)
    der ganze Code ist halt noch sehr durcheinader und solche Funktionen wie Abbrechen etc fehlen noch.
    Eher noch ein Sammelsurium "hihihi"
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    solche Funktionen wie Abbrechen
    haben welche Priorität?
    Bei meinen Programmen gibt es eine Abbruch-Funktion nur bei Messungen, die sehr lange (Minuten bis Stunden) dauern, ansonsten nicht.
    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!
    Priorität: eigentlich gering bzgl der Funktion, weil ich sie nicht brauche.
    Für mich wäre das nur ein goody ABER zur Übung und zum Verständnis sehr lehrreich, weswegen ich das gerne einbauen würde.

    Ich überlege auch ob ich von VB weg soll und zu C# wechsel... weil fast alles im web immer über C# ist und ich erst immer umbauen muss ;(

    @RodFromGermany
    Edit 23:10
    Habe nun nochmal einiges ausprobiert aber ohne das Async friert mir das Form immer ein, also muss ich mit Invoke arbeiten..
    Also wenn es da etwas anderes gibt....???
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    Also wenn es da etwas anderes gibt....???
    Poste mal das Projekt.
    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!
    Das hier ist der Abschnitt " Dateien suchen " der funktioniert.
    @RodFromGermany
    EDIT: 7:55 Uhr

    Habe nochmal umgebaut und alles etwas schlanker gemacht.

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Amelie“ ()

    Amelie schrieb:

    Das hier ist der Abschnitt " Dateien suchen " der funktioniert.
    Bei mir nicht.
    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!
    Also bei mir klappt das
    Habe das vergessen... ist nur zum Test so im Code fest hinterlegt

    VB.NET-Quellcode

    1. Private Sub Frm_Mainform_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Mainclass.CurrentDrive = "y:\"
    3. Mainclass.Fileextension = "*.jpg"
    4. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Also bei mir klappt das
    Der Code, den Du postest, ist in sich nicht vollständig!
    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 schrieb:

    Hier ist alles
    Leider nicht.
    Überzeuge Dich davon, dass der Code in einem leeren Projekt mit den entsprechenden GUI-Elementen compiliert.
    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

    So nun mal bereinigt und gezipt. Das zip nochmal geprüft und nun hochgeladen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    @Amelie Warum ist der Abbruch-Button ge-disabled?
    Warum lässt sich Deine Form Frm_Mainform nicht im Designer öffnen?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Mainform
    2. Private WithEvents Helper As New Mainclass
    3. Private AbortToken As New CancellationTokenSource()
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Helper.CurrentDrive = "d:\"
    6. Helper.Fileextension = "*.dll"
    7. End Sub
    8. #Region "FilsSearch"
    9. Private Async Sub Btn_Suchen_Click(sender As Object, e As EventArgs) Handles Btn_Suchen.Click
    10. LstView_Searchfiles.Items.Clear()
    11. Btn_Abbruch.Enabled = True
    12. Lbl_Response.Text = ""
    13. AbortToken = New CancellationTokenSource
    14. Await Task.Run(Sub() SearchFiles(AbortToken.Token))
    15. End Sub
    16. Private Sub SearchFiles(AbortToken As CancellationToken)
    17. If Helper.IsDriveReady(Helper.CurrentDrive) Then
    18. Try
    19. Helper.TargetFiles.Clear()
    20. Helper.InaccessibleDirectories.Clear()
    21. Dim Root = Helper.HDDS
    22. Helper.PutFilesIntoListBoxFrom(New DirectoryInfo(Helper.CurrentDrive.ToString), Helper.Fileextension)
    23. Catch ex As Exception
    24. 'Todo Fehlerausgabe
    25. End Try
    26. Else
    27. 'ToDo Fehlerausgabe
    28. End If
    29. If Not AbortToken.IsCancellationRequested Then
    30. Me.BeginInvoke(Sub() AfterSearch())
    31. End If
    32. End Sub
    33. #End Region
    34. Private Sub AfterSearch()
    35. For Each file As FileInfo In Helper.TargetFiles
    36. LstView_Searchfiles.Items.Add(New ListViewItem(file.FullName))
    37. Next
    38. LstView_Searchfiles.Items.Item(LstView_Searchfiles.Items.Count - 1).EnsureVisible()
    39. LstView_Searchfiles.Items.Item(LstView_Searchfiles.Items.Count - 1).Selected = True
    40. Lbl_Response.Text = ("Anzahl : " & LstView_Searchfiles.Items.Count)
    41. Btn_Abbruch.Enabled = False
    42. End Sub
    43. Private Sub Btn_Abbruch_Click(sender As Object, e As EventArgs) Handles Btn_Abbruch.Click
    44. AbortToken.Cancel()
    45. MessageBox.Show("Abbruch", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information)
    46. AbortToken.Dispose()
    47. ClearListview()
    48. End Sub
    49. Private Sub ClearListview()
    50. Lbl_Response.Text = "User abort"
    51. Btn_Abbruch.Enabled = False
    52. LstView_Searchfiles.Items.Clear()
    53. Helper.TargetFiles.Clear()
    54. Helper.InaccessibleDirectories.Clear()
    55. End Sub
    56. End Class
    Und: Nur ein einziges Invoke!
    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!