2017-10-30 1 views
-1

Ich schrieb einen einfachen Code, der Anmeldeinformationen zu einer Website. Ich brauche den Rückgabewert, aber ich bekomme eine Null, die zu ArgumentException führt. Wie kann ich tun, um diese richtigWert von Aufgabe mit Lambda-Ausdruck erhalten

Imports System.Net 
Imports System.Text 

Public Class Form1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim routerUri = "http://127.0.0.1/login.cgi" 
     Dim routerMethod = "POST" 
     Dim routerPostData = New Specialized.NameValueCollection From { 
       {"username", ""}, 
       {"password", ""}, 
       {"foo", "bar"} 
      } 
     Console.WriteLine(Encoding.UTF8.GetString(GetResponse(routerUri, routerMethod, routerPostData))) 
    End Sub 
    Function GetResponse(hUri As String, hMethod As String, rqParam As Specialized.NameValueCollection) 
     Dim uriUri As New Uri(hUri) 
     Dim rByte 
     Dim tTask = New Task(
      Async Sub() 
       Dim task As Task(Of Byte()) = SendRequest(uriUri, hMethod, rqParam) 
       rByte = Await task 
      End Sub) 
     tTask.Start() 
     tTask.Wait() 
     Return rByte 
    End Function 

    Async Function SendRequest(hUri As Uri, hMethod As String, rqParam As Specialized.NameValueCollection) As Task(Of Byte()) 
     Dim rByte As Byte() 
     Using client As New WebClient 
      rByte = Await client.UploadValuesTaskAsync(hUri, hMethod, rqParam) 
     End Using 
     Return rByte 
    End Function 
End Class 
+0

, welche Linie die Ausnahme verursacht? –

Antwort

1

Event-Handler für Async Subs ermöglichen, so wäre es besser, nur die Handler async zu machen und von der Asynchron-Funktion direkt aufrufen. Vermeiden Sie es, neue Task s manuell zu erstellen.

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim routerUri = "http://127.0.0.1/login.cgi" 
    Dim routerMethod = "POST" 
    Dim routerPostData = New Specialized.NameValueCollection From { 
      {"username", ""}, 
      {"password", ""}, 
      {"foo", "bar"} 
     } 
    Dim bytes = Await GetResponseAsync(routerUri, routerMethod, routerPostData) 
    Console.WriteLine(Encoding.UTF8.GetString(bytes)) 
End Sub 

Wo GetResponseAsync ist

Async Function GetResponseAsync(hUri As String, hMethod As String, rqParam As Specialized.NameValueCollection) As Task(Of Byte()) 
    Dim uriUri As New Uri(hUri) 
    Return Await SendRequest(uriUri, hMethod, rqParam)   
End Function 

Referenz Async/Await - Best Practices in Asynchronous Programming

+0

Ich sehe, dass es einen eigenen Thread hervorbringt. Welchen Teil des Codes, wo es das eigentlich macht? – conquistador

+0

@conquistador überprüfen Sie den Link in der Antwort zur Verfügung gestellt. – Nkosi