2013-02-21 51 views
1

我想获得一个简单的异步例子与等待工作,但我不认为它是。我认为这个代码应该需要10秒(或者超过10秒)才能运行,因为每个循环中的每个函数都应该异步运行。简单的ASP.NET 4.5异步并在VB.NET中等待

这是一个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 

在此先感谢!

+0

我有VB.NET和Task.delay问题;我几乎重复了上面的代码。但是当我运行代码时,浏览器就锁定了。就像线程继续运行一样,永远不会释放回调用线程(UI)。注意:Thread.sleep可以工作,但它使我的代码同步运行。我正在寻找并行运行。 Task.Dely的任何帮助确实锁定了我的概念验证(在上面的例子中),我们将非常感激。我甚至尝试使用下面的[答案];浏览器停止工作(锁定)。 – 2013-04-29 20:44:17

回答

3

不,他们不会因为异步你说这里“直到你得到的结果不进行”运行:

r1 = Await processAsyncA(10) 

你应该做的,而不是推出是所有的processXXX函数和然后等待所有这些。喜欢的东西:

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) & " " 

(不干净的代码,但希望你得到的要点)

+2

+1。您也可以使用Task.WhenAll一次等待多个任务。 – 2013-02-21 11:39:07

+0

谢谢!你的逻辑是有道理的,但我认为语法仍然存在问题:当我用你提供的代码替换我的For Each块时,我得到一个“对象引用未设置为对象的实例”。在这条线上的错误: Add(processAsyncA(10)) 任何想法我失踪? – sqlchris 2013-02-22 20:04:42

+0

我不确定Task.WhenAll会有帮助,因为我不认为我的函数首先是异步运行的。请提供一个代码示例,如果我缺少一些东西...... – sqlchris 2013-02-22 20:07:13