简体   繁体   English

简单的ASP.NET 4.5异步并在VB.NET中等待

[英]Simple ASP.NET 4.5 async and await in VB.NET

I am trying to get a simple example of async with await working but I don't think it is. 我试图得到一个简单的异步示例等待工作,但我认为不是。 I am thinking this code should take 10 seconds (or just over 10 seconds) to run as each function within the for each loop is supposed to run asynchronously. 我认为这段代码需要花费10秒钟(或超过10秒钟)来运行,因为每个循环中的每个函数都应该异步运行。

This is an asp.net web forms and Async="true" is present in the page declaration. 这是一个asp.net Web表单,Async =“true”出现在页面声明中。

Inherits System.Web.UI.Page

Protected Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'This needs to execute different asynchronous processes based on the array value
    Dim ItemList(2) As String

    ItemList(0) = "A"
    ItemList(1) = "B"
    ItemList(2) = "C"

    Dim time_start As DateTime
    Dim time_end As DateTime

    Dim r1 As String
    Dim r2 As String
    Dim r3 As String

    'capture start time
    time_start = DateTime.Now

    'run async processes for each item in array
    For Each element As String In ItemList
        Select Case element
            Case "A"
                r1 = Await processAsyncA(10) & "  "
            Case "B"
                r2 = Await processAsyncB(10) & "  "
            Case "C"
                r3 = Await processAsyncC(10) & "  "
        End Select
    Next

    'capture end time
    time_end = DateTime.Now

    'display total duration in seconds
    Label1.Text = DateDiff(DateInterval.Second, time_start, time_end)

End Sub

Protected Async Function processAsyncA(ByVal waittime As Integer) As Task(Of String)
    Await Task.Delay(waittime * 1000)
    Return waittime.ToString
End Function

Protected Async Function processAsyncB(ByVal waittime As Integer) As Task(Of String)
    Await Task.Delay(waittime * 1000)
    Return waittime.ToString
End Function

Protected Async Function processAsyncC(ByVal waittime As Integer) As Task(Of String)
    Await Task.Delay(waittime * 1000)
    Return waittime.ToString
End Function

Thanks in advance! 提前致谢!

No, they won't run asynchronously because you've said "don't carry on until you've got the result" here: 不,他们不会异步运行,因为你说“在得到结果之前不要继续”:

r1 = Await processAsyncA(10)

What you should instead do is launch all of the processXXX functions and then await all of them. 您应该做的是启动所有processXXX函数, 然后等待所有这些函数。 Something like: 就像是:

Dim l as New List(Of Task(Of String))

'run async processes for each item in array
For Each element As String In ItemList
    Select Case element
        Case "A"
            l.Add(processAsyncA(10))
        Case "B"
            l.Add(processAsyncB(10))
        Case "C"
            l.Add(processAsyncC(10))
    End Select
Next

r1 = Await l(0) & "  "
r2 = Await l(1) & "  "
r3 = Await l(2) & "  "

(Not the cleanest code, but hopefully you get the gist) (不是最干净的代码,但希望你得到的要点)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM