Thread Sleep和setTimeout问题

时间:2013-09-04 21:08:30

标签: javascript vb.net

我确信我可能在这里错过了一些逻辑元素,但从表面上看,我正在做的事情似乎应该有效。为了首先给你一个概述,我正在使用vb.net循环一个网格视图并拉出我存储在会话变量中的值。然后它通过javascript打开一个页面,并使用打开页面上的会话变量从填充页面的数据库中提取数据。它从重写的Render函数中抓取HTML并将其拉入文件。

大多数都运行良好,但问题是当我在循环中使用Thread.Sleep时,它会在所有页面的总持续时间内休眠 - 例如,如果我打开10页并且有5秒钟的睡眠,线程暂停50秒,然后快速触发window.open。如果我使用javascript并将setTimeout暂停5秒,它会在第一次通过时再次快速触发gridview中的其余文档。

以下是我目前的情况:

Protected Sub ArchiveAll_Click(sender As Object, e As EventArgs) Handles ArchiveAll.Click
    Dim rowcount As Integer = GridView1.Rows.Count
    Dim counter As Integer = 0
    Dim url = "foo.aspx?"
    Dim IDGrab As String = ""
    Dim IDGrab2 As String = ""




    Session("IDHolder") = Now.Year.ToString + Now.Month.ToString + Now.Day.ToString + Now.Hour.ToString + Now.Minute.ToString

    While counter < rowcount
        IDGrab = GridView1.Rows(counter).Cells(1).Text
        IDGrab2 = GridView1.Rows(counter).Cells(2).Text
        Session("FormID") = IDGrab
        Session("UserName") = IDGrab2
        WriteAction()
        counter = counter + 1

    End While


End Sub

Private Sub WriteAction()
    Dim url = "foo.aspx?"
    Response.Write("<script>setTimeout(function(){window.open('" & url & "','')},5000);</script>")
End Sub

所以这样做 - 更准确 - 在点击ArchiveAll后五秒钟,它打开~100个窗口而不是打开一个,等待五秒钟,然后打开另一个窗口。崩溃的城市。

那我在这里错过了什么?如果真的很简单,我甚至可以自己踢。

1 个答案:

答案 0 :(得分:0)

因为它们都在等待5秒钟,所以它们不会异步排队。如果你想在每个之间等待5秒钟,你需要增加每个之间的时间。

window.setTimeout(...,5000);
window.setTimeout(...,10000);
window.setTimeout(...,15000);

更好的是,构建一个将url从数组中取出的函数。

var urls = ["page1.html","page2.html","page3.html"];
function openPage() {
    var url = urls.shift();
    window.open(url);
    if (urls.length) {
        window.setTimeout(openPage,5000);
    }
}
openPage();