Zuerst suchte ich hier und habe viele ähnliche Fragen gesehen, aber keine von ihnen ist was ich will.Ist das eine gute Praxis für das asynchrone Arbeiten?
Ich habe eine Funktion, die einige Zeit einen Wert zurückgeben nimmt zu vereinfachen, lassen Sie uns sagen, es ist: es laufen
Private Function longProcess() As Boolean
Threading.Thread.Sleep(10000)
Return True
End Function
ich will und seinen Wert zu erhalten, lassen Sie uns Button1
auf klicken sagenich habe versucht, den folgenden Code und es funktioniert perfekt
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'some stuff
Dim output As Boolean = Await Task.Run(Of Boolean)(Function() longProcess())
'continue another stuff when the longProcess completes
End Sub
Wenn auf diese Weise gut genug ist? wenn nicht, welche Probleme hat es vielleicht?
ich einen anderen Weg wurde mit, aber es machte die CPU-Auslastung höher wegen Application.DoEvents()
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'some stuff
Dim awaiter = Task.Run(Of Boolean)(Function() longProcess()).GetAwaiter()
Do While Not awaiter.IsCompleted
Application.DoEvents()
Loop
Dim output As Boolean = awaiter.GetResult()
'continue another stuff when the longProcess completes
End Sub
Haben Sie Probleme, wenn Sie die erste Option verwenden? Wenn Sie es nicht weiter verwenden, bis Sie einige Probleme haben. – Fabio
Keine Probleme mit Code zu haben bedeutet nicht, dass es in Ordnung ist. Ich frage, ob es technisch gut ist oder es einen besseren kurzen Weg gibt. – Youssef13
Was Sie erwarten, "kürzer" als eine Zeile Code zu sein. Mit Ihrer ersten Option führen Sie die Funktion für einen anderen Thread aus, der im UI-Client-Ereignishandler korrekt abgewartet wurde. Wenn also die erste Option nicht gegen Ihre Anforderungen verstößt, können Sie sie weiterhin verwenden. Für den Fall, dass eine Long Running-Funktion einige externe Ressourcen (Fily-System, Datenbank, Webdienste usw.) verwendet, ist die erste Option keine bewährte Methode, da auf externe Ressourcen mit 'async-await' effektiver zugegriffen werden kann, ohne zusätzliche Threads zu verwenden. – Fabio