Code Ausführen ohne Programm Aufhang

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Matix Media.

    Code Ausführen ohne Programm Aufhang

    Hallo,
    ich würde gerne einen Code Ausführen. So, ich bin ja nicht dumm, weiß wie das geht. Allerdings hängt das Programm sich auf so lange der Code ausgeführt wird.
    Wie kann ich es machen das sich das Programm nicht aufhängt?

    VB.NET-Quellcode

    1. ​Imports System.Runtime.InteropServices
    2. Imports Microsoft.Win32
    3. Public Class Form1
    4. Private Sub BeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BeendenToolStripMenuItem.Click
    5. Application.Exit()
    6. End Sub
    7. Private Sub EinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EinstellungenToolStripMenuItem.Click
    8. frmSettings.ShowDialog()
    9. End Sub
    10. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    11. Threading.Thread.CurrentThread.CurrentUICulture = New Globalization.CultureInfo(My.Settings.language)
    12. Me.Controls.Clear()
    13. InitializeComponent()
    14. End Sub
    15. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    16. Threading.Thread.Sleep(100)
    17. bgWorker.RunWorkerAsync()
    18. End Sub
    19. Private Sub bgWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
    20. BeginInvoke(Sub()
    21. Dim rootnode As TreeNode
    22. rootnode = getnodes(My.Computer.Registry.ClassesRoot)
    23. tvNodes.Nodes.Add(rootnode)
    24. rootnode = getnodes(My.Computer.Registry.CurrentUser)
    25. tvNodes.Nodes.Add(rootnode)
    26. rootnode = getnodes(My.Computer.Registry.LocalMachine)
    27. tvNodes.Nodes.Add(rootnode)
    28. rootnode = getnodes(My.Computer.Registry.Users)
    29. tvNodes.Nodes.Add(rootnode)
    30. rootnode = getnodes(My.Computer.Registry.CurrentConfig)
    31. tvNodes.Nodes.Add(rootnode)
    32. End Sub)
    33. End Sub
    34. Private Function getnodes(ByVal regkey As RegistryKey) As TreeNode
    35. Dim parts() As String = regkey.Name.Split("\")
    36. Dim temp As New TreeNode(parts.Last)
    37. Dim subkey As RegistryKey
    38. If regkey.SubKeyCount > 0 Then
    39. For Each keyName As String In regkey.GetSubKeyNames
    40. Try
    41. subkey = regkey.OpenSubKey(keyName)
    42. temp.Nodes.Add(getnodes(subkey))
    43. Catch ex As Exception
    44. End Try
    45. Next
    46. End If
    47. Return temp
    48. End Function
    49. Private Sub AktualisierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AktualisierenToolStripMenuItem.Click
    50. bgWorker.RunWorkerAsync()
    51. End Sub
    52. End Class
    Grüße, Matix
    1. BGW sind veraltet.
    2. Wo soll der Sinn von dem BGW sein, wenn Du die ganze Arbeit eh wieder auf den UI-Thread delegierst?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Wo hängt es denn Deiner Messung nach zeitlich?

    btw:
    1. Zeile#6: Application.Exit ist fast so schlimm wie End. Warum nicht einfach das Formular schließen und so ein sauberes Beenden ermöglichen?
    2. Z#10: RfG wird's Dir um #die Ohren hauen, wenn ich nicht schneller bin: Dialoge richtig instanziieren.
    3. Z#17: In Form1.Load??? Das gehört wohl eher in den Konstruktor.
    4. Backgroundworker? Alteisen.
    5. Z#43 ist Option Strict Off6. Z#48, #51, #52: Undifferenziertes Try-Catch
    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.
    Offensichtlich bist du selbst schon dahiner gekommen, dass man etwas in separaten Threads ausführen muss, damit die Oberfläche nicht einfriert. Dies ist nicht ganz so simpel wie man meint.

    Folgendes ist mein Vorgehen wenn ich mit Threads arbeite:
    1. Alle Daten laden/verarbeiten
    2. Daten anzeigen
    Punkt 1 kann in einem separaten Thread per Async/await laufen. Punkt 2 wird im Main Thread gemacht.

    Wenn du in deinem BGW alles Invokest geht dessen Vorteil verloren und die Oberfläche hängt wieder. ->
    Erst Daten (asynchron) Laden, dann anzeigen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Matix Media tu dir selbst einen gefallen und nehme die Ratschläfe die dir gemacht werden bitte mal an.
    Die Leute hier wissen wovon sie reden.

    In jedem Thema von dir werden dir fast die selben Ratschläge gegeben. Setzte diese doch mal um und du wirst sehen das so einiges gleich viel besser von der Hand geht.
    Es kommt dir zu gute, glaub mir.

    Also, anhand der Vorschläge nun mal den Code umschreiben und nochmals Posten, mal sehen ob hier der Lerneffekt mal früchte trägt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hab das mal auf Async/Await umgeschrieben, werde dies aber noch nicht posten, da sonst Lerneffekt = 0.

    Du willst die Registry in ihrer Gesamtheit darstellen. Den Nutzen kenne ich zwar nicht, aber es dauert. Lange. Nach ca. ner halben Minute (das Programm ist immer noch im ROOT-Node) kommt allerdings eh ne Fehlermeldung, da subkey in Z#49 auch mal Nothing sein kann. Sowas mit nem Try-Catch abzufangen ist Fehldesign. Oder welche anderen Exceptions sind Dir begegnet?
    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.
    /EDIT//
    @VaporiZed danke das du es nicht postest. Er hat schon genügend Beispiele und auch Lektüre bekommen um das selber mal zu recherchieren.

    Zeile 48 - 52: Was soll das Try-Catch bezwecken ? Wenn Fehler ist ignorieren ?

    siehe: TryCatch ist ein heißes Eisen
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Ich werde eure ganzen Ratschläge mal hinnehmen, am besten gefällt mir das mit den zwei ebenen Laden, das haben ich auch schon Probiert, leider hab ich es nicht hinbekommen und den Code darauf gelöscht. Heute habe ich leider keine zeit mehr das ganze zu machen (hab morgen Schule), aber ich danke euch für eure ganzen Rückmeldungen!
    Grüße, Matix