Wie ShowDialog() asynchron und thread-sicher ausführen?

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Wie ShowDialog() asynchron und thread-sicher ausführen?

    Hallo miteinander,

    ich möchte von meinem selbst geschriebenen WPF-Dialog die Methode ShowDialog()
    so aufrufen, daß sie im Gegensatz zum normalen modalen Verhalten den Aufrufer-Thread
    nicht blockiert und daß sie auch thread-sicher ausgeführt wird.
    Das kann ich zum einen über das async-await-Konstrukt und zum anderen mit dem BeginInvoke realisieren, oder?
    Also beim BeginInvoke meckert der Compiler immer (den genauen Fehler ergänze ich noch morgen):

    VB.NET-Quellcode

    1. Public Async Function ShowDialogAsync() As Task(Of MsgBoxResultType)
    2. Dim result As MsgBoxResultType
    3. Dim completion As TaskCompletionSource<MsgBoxResultType> = new TaskCompletionSource()
    4. Me.Dispatcher.BeginInvoke(New Action(Function() completion.SetResult(ShowDialog())))
    5. result = completion.Task.Result
    6. End Function

    Falls jemand von euch schon mal den Fehler sehen kann, bin ich über eine Antwort sehr dankbar!

    Vielen Dank im Voraus.

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

    Verstehe ich nicht. .ShowDialog ist doch dafür da, dass sich der Dialog modal verhält.
    Wenn er das nicht soll, rufe ihn mit .Show auf.



    Jedenfalls Async/Await geht viel einfacher - die Methode kannste löschen.

    Async/Await musste beim Aufrufer hinmachen, also wo das aufgerufen wird - zeig mal die Methode (inklusive Kopf-Zeile), die das ShowDialogAsync() aufrufen sollte.

    Achso - bitte in vb.net - Tags, damit mans auch lesen kann:
    Hallo ErfinderDesRades,

    erstmal vielen Dank für die Info!
    Ich weiß den Unterschied zwischen Show() und ShowDialog().
    Ich bin jedoch in einer Zwickmühle: Auf der einen Seite darf ich den aufrufenden Code in seiner
    Ausführung nicht anhalten, auf der anderen Seite muss sich mein Dialog trotzdem "modal" verhalten,
    also erst mit der Ausführung fortfahren, wenn der Benutzer den Dialog schließt (durch Drücken von OK oder Cancel).
    Weil sich das ja widerspricht, ist mein Gedanke, den Dialog in einem anderen Kontext (Thread oder Task) auszuführen.
    Hier der Aufrufer-Code:

    Private Async Function BenutzerEingabe() As Task(Of Tuple(Of MsgBoxResult, String))
    Dim EingabeDlg As EingabeDialog = New EingabeDialog(TitelLizenzCheck, True, "Eingabe-Dialog")
    Dim DlgResult As MsgBoxResult = Await EingabeDlg.ShowDialogAsync()
    Dim Eingabe As String = EingabeDlg.EnteredInput
    Return New Tuple(Of MsgBoxResult, String)(DlgResult, Eingabe)
    End Function
    bitte CodeTags verwenden

    Gib uns mal bitte ein konkretes Beispiel, damit wir verstehen, was da ablaufen soll.
    Denn: Du sagst, dass Du die Codeausführung nicht anhalten darfst, aber gleichzeitig, dass die Ausführung erst forgesetzt werden darf, wenn der User entschieden hat einen Button anzuklicken. Das schließt sich gegenseitig aus.
    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.
    (jo, verstanden habich die Zwickmühle auch net, aber) probierma so:

    VB.NET-Quellcode

    1. Private Async Function BenutzerEingabe() As Task(Of Tuple(Of MsgBoxResult, String))
    2. Dim EingabeDlg = New EingabeDialog(TitelLizenzCheck, True, "Eingabe-Dialog")
    3. Dim DlgResult = Await Task.Run(Function() EingabeDlg.ShowDialog())
    4. Dim Eingabe As String = EingabeDlg.EnteredInput
    5. Return Tuple.Create(DlgResult, Eingabe)
    6. End Function
    Wie gesagt: deine selbstgebastelte ShowDialogAsync löschen.
    Ist aber ungetestet, weil ich hab ja nicht deine Solution hier verfügbar.

    Und bitte vb-Tag benutzen: ansonsten ich zumindest nicht mehr auf deine Posts antworte.