2016-10-27 2 views
0

Ich habe wie unten eine VB.NET-Funktion:Warum die Async-Funktion System.Threading.Tasks.Task`1 [System.String] zurückgibt?

Public Shared Async Function GetIdDoc() As Task(Of String) 
    Dim result As String = "" 
    'Dim Uri As String = "http://localhost:53917/api/Documenti/GetNextIdDocumenti" 
    Dim Uri As String = apiUri & ApiEndPoints.GetNextIdDocumenti 

    Using client = New HttpClient() 
     Using response = Await client.GetAsync(Uri) 
      If response.IsSuccessStatusCode Then 
       Dim DocumentiIDJsonString = Await response.Content.ReadAsStringAsync() 
       result = DocumentiIDJsonString.ToString() 

      End If 
     End Using 
    End Using 
    Return result 
End Function 

Ich versuche, das Dokument-ID aus der DB zurück, aber ich bin

System.Threading.Tasks.Task` bekommen 1 [System.String]

Wo eigentlich sollte es "2" zurückgeben. Bitte helfen Sie mir dabei: Was mache ich falsch mit dieser Funktion?

aktualisieren

hier ist die Funktion aufgerufen:

txtIDDoc_Detail.Text = ApiData.GetIdDoc().ToString() 

Aber in der Textbox erhalte ich den oben stehenden Text. Vielen Dank.

+0

Bitte bearbeiten Sie Ihre Frage, um auch den Code zu zeigen, wo die Funktion aufgerufen wird. –

+0

Bitte überprüfen Sie meine aktualisierte Frage. Vielen Dank. – barsan

+0

Sie sollten "GetIdDoc" wahrscheinlich in "GetIdDocAsync" umbenennen, um dem allgemein empfohlenen Muster für asynchrone Methoden zu folgen. –

Antwort

3

Ich bin von C#, sollte aber das gleiche funktionieren. In neueren .Net-Versionen (> = 4.5) ist async/await implementiert. Wenn also eine Methode als async markiert ist und eine Aufgabe zurückgibt (was immer der Fall sein sollte), müssen Sie darauf warten. Dies impliziert, dass Sie Ihre Methode auch als async markieren müssen. So sollte Ihr Aufruf wie folgt aussehen:

txtIDDoc_Detail.Text = await ApiData.GetIdDoc(); 

Das erwarten wartet, bis die lange laufende Aufgabe fertig ist und gibt es innere Wert. Alle asynchronen Methoden sollten Task zurückgeben. Wenn die Methode ungültig ist, wäre dies Aufgabe. Sonst könnte es Task<int> oder irgendein anderer Typ sein. So erwartet es und Sie können am Laufen halten;)

+0

@ Nkosi Danke. Bearbeitet. – Sebi

+0

Oder 'txtIDDoc_Detail.Text = ApiData.GetIdDoc.Result ', wenn Sie es (aus welchem ​​Grund auch immer) synchron ausführen möchten. –

+0

@BradleyUffner - 'ApiData.GetIdDoc.Result' kann einen Deadlock verursachen. – Fabio

1

@Sebi gibt eine große Erklärung, wie richtig async und await in diesem Fall benutzen, aber ich werde erweitern auf genau warum Sie das Ergebnis erhalten, die du siehst.

txtIDDoc_Detail.Text = ApiData.GetIdDoc().ToString() 

Ist

Rückkehr

System.Threading.Tasks.Task`1 [System.String]

Weil Sie .ToString auf der Instanz der TaskTask(Of String) anrufen, nicht das tatsächliche Ergebnis. Typen, die .ToString nicht überschreiben, erben das Verhalten von Object, das nur den Name des Typen als eine Zeichenfolge zurückgibt.

Sie wollen wahrscheinlich diesen (asynchronen Aufruf):

txtIDDoc_Detail.Text = await ApiData.GetIdDoc() 

Oder dieser (synchroner Aufruf):

txtIDDoc_Detail.Text = ApiData.GetIdDoc().Result 

Jeder dieser Anrufe werden von der Aufgabe tatsächlich zur Folge hat, nachdem es abgeschlossen ist.

+0

'ApiData.GetIdDoc(). Ergebnis' kann einen Deadlock verursachen, überprüfen Sie dies für weitere Informationen: [Nicht auf Async-Code blockieren] (http://blog.stephencleary.com/2012/ 07/dont-block-on-async-code.html) – Fabio

+0

Es wird einen Deadlock verursachen, wenn GetIdDoc(); Methode gibt ein Ergebnis in MainThread zurück. Weil die Methode es zurückgeben will, während Ergebnis versucht, darauf zuzugreifen. – Sebi

+0

Vielen Dank für die Erklärung meines Problems. – barsan

Verwandte Themen