Ich habe eine vorhandene DLL mit Funktionen, die einige Zeit dauern können, um Kundendaten abzurufen. Bis jetzt habe ich gute alte threading.thread.start-Methoden benutzt, um die Sperrung der Benutzeroberfläche zu verhindern, aber ich habe versucht, die Await/Async-Methoden in .net 4.5 zu verstehen. Gibt es eine einfache Möglichkeit, einen Await-Wrapper um diese Funktionen zu erstellen? Ich kann die DLL auf 4.5 aktualisieren, aber kann die Struktur des Codes selbst nicht ändern. Alles, was ich versuche, zu einem Fehler von .. Boolean ‚hat Methode eine geeignete GetAwaiter‚‘Await diese Art erfordert‘.net Warten auf vorhandenen/alten Code
Beispiel-Code ist ....
Public Async Function GetByID(id As Integer) As Task(Of Boolean)
'serviceBase is a dll with a number of functions for getting
'data that returns true when a customer object has been filled
Return Await ServiceBase.GetCustomer(id)
End Function
Was ich nicht verstehe, ist Wenn ich GetCustomer in der ServiceBase aktualisieren könnte, müsste ich das als Async markieren und eine Aufgabe (von Boolean) zurückgeben. Aber dann bekomme ich Fehler, weil GetCustomer zu keinem Zeitpunkt Await verwenden muss - es ist eine Anzahl von kleinen Prozessen, die sich insgesamt zu einer blockierten UI addieren.
Ist der Akt des Kunden tatsächlich eine asynchrone Operation zu bekommen? Es macht keinen Sinn, eine synchrone Methode Async zu machen. Könnten Sie stattdessen den Code in GetCustomer zeigen, ist es in diesem Fall interessanter. – kai
Ein Beispiel für diese Funktion (ein Kunde könnte Einzelheiten über die Quelle A & C zum Beispiel) 'Public Function GetCustomer (id As Integer) As Boolean Wenn GetFromSourceA (id) Dann ' etwas Arbeit mit Kunden tun und return true End If Wenn GetFromSourceB (id) Dann 'mit Kunden einige Arbeit zu tun und return true End If Wenn GetFromSourceC (id) Dann ' etwas Arbeit mit Kunden tun und return true End If Wenn IsNothing (Kunde) Then Return Falsch Rückgabe True Ende Funktion ' – user3334804
Was @kai bedeutet ist, dass, außer 'GetCustomer' gibt einen Task zurück und ruft 'Await GetCustomer' nicht auf, um es automatisch asynchron zu machen. 'async/await' ist syntaktischer Zucker, der * schon * asynchrone * Methoden * erleichtert. Wenn "GetCustomer" beispielsweise einen Webdienst aufruft, können Sie 'Await client.CallThatMethodAsync' verwenden, um eine Dienstmethode asynchron aufzurufen und das Ergebnis zu erhalten, anstatt" client.CallThatMethod "synchron aufzurufen. Wenn es eine DB-Zugriffsmethode ist, könnten Sie 'ExecuteReaderAsync' anstelle von' ExecuteReader' verwenden. –