0

我确定我可能在这里遗漏了一些逻辑元素,但从表面上看,我正在做的事情似乎应该奏效。只是先给你一个概述,我使用 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 个窗口,而不是打开一个,等待五秒钟,然后再打开另一个。崩溃城市。

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

4

1 回答 1

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();
于 2013-09-04T21:20:04.703 回答