Prozess asyncron aufrufen

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Prozess asyncron aufrufen

    Hallo zusammen,

    ich möchte mit Async eine Abfrage so einrichten, das sich die entsprechende Form nicht aufhängt während der Befehl Abgearbeitet wird.
    Dazu hab ich hier mal eine Fertige Form, die so auch läuft nur eben ohne Async und await.
    ( Ich verwende Net Framework 4.7.1 Ich denke jedoch das das hier nicht Relevant ist, alles davon läuft auch in 4.5 oder noch ältereren Versionen.
    Ich hab mir vorgestellt das Button1_ Der Prozess P Async laufen soll, somit würde die Form an sich nicht stehen bleiben während P Läuft.. (P ist hier ein cmd mit welchen man z.b. irgendwas machen kann, pingen, ipconfig etc... manchmal dauert der Durchlauf eben länger und das stört die Form.. Sie ist Blockiert.. Falls jemand Interessiert ist kann mir da ja gerne Helfen..
    Edit: Zum Nachbauen.. 1 Listbox(Listbox1), 1 Richtextbox(rtbresult) 2 Buttons 1 Textbox(tbCmd).

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Console
    3. Private Sub Console_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. FormBorderStyle = FormBorderStyle.None
    5. End Sub
    6. Private Sub Console_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    7. If (e.Button = Windows.Forms.MouseButtons.Left) Then
    8. Capture = False
    9. WndProc(Message.Create(Me.Handle, &HA1, CType(&H2, IntPtr), IntPtr.Zero))
    10. Else : End If
    11. End Sub
    12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    13. Using P As New Process()
    14. Cursor = Cursors.WaitCursor
    15. With P.StartInfo
    16. .CreateNoWindow = True
    17. .FileName = "cmd"
    18. .RedirectStandardInput = True
    19. .RedirectStandardOutput = True
    20. .UseShellExecute = False
    21. End With
    22. P.Start()
    23. P.StandardInput.WriteLine(tbCmd.Text)
    24. P.StandardInput.WriteLine("exit")
    25. rtbresult.Text = P.StandardOutput.ReadToEnd()
    26. End Using
    27. tbCmd.Undo()
    28. Cursor = Cursors.Default
    29. End Sub
    30. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    31. rtbresult.Undo()
    32. Close()
    33. End Sub
    34. Private Sub ListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    35. tbCmd.Text = CType(Me.ListBox1.SelectedItem, String)
    36. End Sub
    37. End Class
    1. Der Titel ist ausbaufähig, denn viele denken sich beim Lesen bestimmt: "Na, dann mach doch."
    2. Ich lese noch keine Frage. Ich habe aber eine Vermutung, was Dein Anliegen ist.
    3. Schau bei Async, Await und Task rein.
    4. Beachte, dass CEs im Nebenthread (wie Deine RTB) nicht aktualisiert werden können, ohne Invoke zu verwenden.
    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.
    Hab den Titel Ausgebaut. :D

    Also Meine Frage ist, wie bekomme ich den Prozess Aufruf. (P) als Async bzw Await hin..

    Meine Idee bisher:

    VB.NET-Quellcode

    1. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Using P As New Process()
    3. Cursor = Cursors.WaitCursor
    4. With P.StartInfo
    5. .CreateNoWindow = True
    6. .FileName = "cmd"
    7. .RedirectStandardInput = True
    8. .RedirectStandardOutput = True
    9. .UseShellExecute = False
    10. End With
    11. Await Adressof (P.Start())
    12. P.StandardInput.WriteLine(tbCmd.Text)
    13. P.StandardInput.WriteLine("exit")
    14. rtbresult.Text = P.StandardOutput.ReadToEnd()
    15. End Using
    16. tbCmd.Undo()
    17. Cursor = Cursors.Default
    18. End Sub


    Edit:: Hab mir die Beispiele Angeschaut.. Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync() ... Aber wie in Gottes Namen... Setze ich das in meinen Beispiel ein.. Zumal P bei mir ja ein Fremd Prozess Startet..
    Oder sollte ich lieber rtbresult.Text = Await Adressof P.StandardOutput.ReadToEnd() oder so ansetzen??

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

    Hi,

    Du musst hier nicht unbedingt mit Async/Await arbeiten. Die Process-Klasse hat asynchrone Methoden, um aus dem OutputStream zu lesen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim p As New Process()
    4. Dim sI As New ProcessStartInfo()
    5. sI.FileName = "tracert"
    6. sI.Arguments = "www.google.de"
    7. sI.RedirectStandardOutput = True
    8. sI.UseShellExecute = False
    9. sI.CreateNoWindow = True
    10. p.StartInfo = sI
    11. p.Start()
    12. p.BeginOutputReadLine()
    13. AddHandler p.OutputDataReceived, Sub(x, y)
    14. Me.TextBox1.Invoke(Sub() Me.TextBox1.Text &= y.Data & Environment.NewLine)
    15. End Sub
    16. End Sub
    17. End Class


    Hab hier extra "tracert" genommen, da dies in der Regel länger dauert und blockieren würde. Lass Dir aber gesagt sein, dass viele Dinge, wie Ping usw. auch in .NET vorhanden sind und nicht der Umweg über die CommandShell gegangen werden muss.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hi, danke für deine fixe Antwort..
    Ja du hast recht, ping usw findet man auch in .net.. Das ist ja nicht das Ziel.. Deswegen sind die Befehle nicht vorkonfiguriert.. Es geht alles was man im cmd machen kann eben auch hier. Hab nur in der Listbox die man im Netzwerk des öfteren Nutzt. Also so was wie netsh wlan show drivers ipconfig /all , ipconfig /flushdns uvm.. Alleine netsh kann folgendes..

    Befehle in diesem Kontext:

    abort - Verwirft Änderungen, die im Offlinemodus vorgenommen wurden.
    add - Fügt einen Konfigurationseintrag zur Liste hinzu.
    advfirewall - Wechselt zum "netsh advfirewall"-Kontext.
    alias - Fügt einen Alias hinzu.
    branchcache - Wechselt zum "netsh branchcache"-Kontext.
    bridge - Wechselt zum "netsh bridge"-Kontext.
    bye - Beendet das Programm.
    commit - Überträgt Änderungen, die im Offlinemodus vorgenommen wurden.
    delete - Löscht einen Konfigurationseintrag aus der Liste der Einträge.
    dhcpclient - Wechselt zum "netsh dhcpclient"-Kontext.
    dnsclient - Wechselt zum "netsh dnsclient"-Kontext.
    dump - Zeigt ein Konfigurationsskript an.
    exec - Führt eine Skriptdatei aus.
    exit - Beendet das Programm.
    firewall - Wechselt zum "netsh firewall"-Kontext.
    help - Zeigt eine Liste der Befehle an.
    http - Wechselt zum "netsh http"-Kontext.
    interface - Wechselt zum "netsh interface"-Kontext.
    ipsec - Wechselt zum "netsh ipsec"-Kontext.
    lan - Wechselt zum "netsh lan"-Kontext.
    mbn - Wechselt zum "netsh mbn"-Kontext.
    namespace - Wechselt zum "netsh namespace"-Kontext.
    netio - Wechselt zum "netsh netio"-Kontext.
    offline - Setzt den aktuellen Modus auf offline.
    online - Setzt den aktuellen Modus auf online.
    p2p - Wechselt zum "netsh p2p"-Kontext.
    popd - Wechselt zum durch pushd im Stapel gespeicherten Kontext.
    pushd - Überträgt den aktuellen Kontext auf den Stapel.
    quit - Beendet das Programm.
    ras - Wechselt zum "netsh ras"-Kontext.
    rpc - Wechselt zum "netsh rpc"-Kontext.
    set - Aktualisiert Konfigurationseinstellungen.
    show - Zeigt Informationen an.
    trace - Wechselt zum "netsh trace"-Kontext.
    unalias - Löscht einen Aliasnamen.
    wcn - Wechselt zum "netsh wcn"-Kontext.
    wfp - Wechselt zum "netsh wfp"-Kontext.
    winhttp - Wechselt zum "netsh winhttp"-Kontext.
    winsock - Wechselt zum "netsh winsock"-Kontext.
    wlan - Wechselt zum "netsh wlan"-Kontext.

    und je nach dem was man machen will, hängt die Form und oder Reagiert nicht mehr. Deswegen muss ich da Async laufen.. Damit der Prozess ausgeführt wird. und sich nicht aufhängt.. (Z.b. bei einer fehlerhaften Eingabe.. Ich hab ja extra auf try catch verzichtet.


    AAHHHH Stop...

    AddHandler p.OutputDataReceived, Sub(x, y)
    Me.TextBox1.Invoke(Sub() Me.TextBox1.Text &= y.Data & Environment.NewLine)
    End Sub


    Interessant.. Mal Testen..
    Ich weiß nicht ob ich einen neuen Thread auf machen sollte, aber jetzt hab ich das Problem das mein Downloader während er Runterläd, und der Balken sich füllt, die Zeit, DownloadGeschwindigkeit und Fortschritt in % uvm.. Nicht mehr Anzeigt, erst wenn der Download Komplett ist. Wo ich noch eine Langsamme DSL Verbindung hatte war das alles kein Problem da wurde alles Korrekt Angezeigt.. Jetzt mit DSL250, geht das irgendwie nicht mehr.. Weiß jemand Rat?

    Edit: Hab den Fehler gefunden.. Hab vergessen die Labels zu Refreshen..
    Jetzt geht es wie gewünscht.

    VB.NET-Quellcode

    1. Private Sub downloader_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles _wC.DownloadProgressChanged
    2. ProgressBar1.Value = e.ProgressPercentage
    3. Dim groß As Long = e.BytesReceived / 1024
    4. Dim total As Long = e.TotalBytesToReceive / 1024
    5. Button2.Enabled = True
    6. Button4.Enabled = False
    7. Label17.Text = e.ProgressPercentage & " %"
    8. Label13.Text = groß & ("00.00 KB")
    9. Label14.Text = total & ("00.00 KB")
    10. Label15.Text = (groß / (DirectCast(e.UserState, Stopwatch).ElapsedMilliseconds / 1024)).ToString("00.00 KB/s")
    11. Label17.Refresh()
    12. Label13.Refresh()
    13. Label14.Refresh()
    14. Label15.Refresh()
    15. End Sub

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

    @Andy2002
    Ich habe nun den Titel bearbeitet da dieser nicht nur viel zu lange sondern auch wenig aussagekräftig war.
    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. ##