2016-03-21 7 views
0

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.

+0

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

+0

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

+0

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. –

Antwort

0

Wenn die Methoden, für die Sie asynchrone Wrapper verwenden möchten, nicht wirklich asynchron sind, sind sie nicht wirklich I/O, sondern lang andauernde Prozesse, die Ihre Benutzeroberfläche auf einer Desktop-Anwendung blockieren, wickeln Sie den eigentlichen Aufruf einfach um die DLL-Methode in Await Task.Run (Function() ServiceBase.GetCustomer (id)). Wenn es sich um eine asp.net-Anwendung handelt, lassen Sie zu, dass der synchrone Vorgang synchron ist.

Was Sie nicht tun möchten, ist eine gefälschte asynchrone Wrapper erstellen und fügen Sie es zu Ihrer DLL durch den Aufruf von Task.Run. Wenn etwas an die CPU gebunden ist und es die Benutzeroberfläche (Desktop-App) blockiert, rufen Sie es einfach mit Task.Run in Ihrem spezifischen Anwendungskontext auf und erstellen Sie keine gefälschte asynchrone Implementierung in Ihrer DLL. Hier sind einige gute Ressourcen, die von Stephen Cleary auf der Sache:

Stephen Cleary's Blog on Task.Run

+0

Perfect thanks, der Hauptgrund, warum ich die DLL nicht berühren wollte, war, dass ich dort funktionieren wollte, um synchron zu bleiben, und es fühlte sich nicht richtig an, das zu ändern. Die Ressource bestätigt meine Gedanken, dass dies eine schlechte Übung wäre. Daher funktioniert das Wechseln zu Async mit Task.Run auf der UI/Anwendungsseite des Zauns gut. Ich denke, am Ende des Tages habe ich nicht wirklich viel mehr gewonnen, als Code zu haben, der viel einfacher zu verstehen/zu lesen ist. Wenn ich etwas davon neu schreibe, scheint es ein lohnender Job zu sein. – user3334804

+0

Völlig verstehen. Ich habe kürzlich eine Desktop-Anwendung in einem ähnlich klingenden Szenario bearbeitet. – davidallyoung