【问题标题】:Getting value from Task with lambda expression使用 lambda 表达式从 Task 中获取值
【发布时间】:2017-10-30 11:21:38
【问题描述】:

我编写了一个简单的代码,可以将凭据发布到网站。我需要返回值,但我得到一个空值,结果为ArgumentException。我怎样才能正确地做到这一点

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

【问题讨论】:

  • 哪一行导致异常?

标签: vb.net lambda async-await task


【解决方案1】:

事件处理程序允许 Async Subs,因此最好使处理程序异步并直接调用异步函数。避免手动创建新的Tasks。

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

GetResponseAsync 在哪里

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

参考Async/Await - Best Practices in Asynchronous Programming

【讨论】:

  • 我看到它产生了自己的线程。它实际执行该操作的代码的哪一部分?
  • @conquistador 查看答案中提供的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2012-09-10
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多