我确信我可能在这里错过了一些逻辑元素,但从表面上看,我正在做的事情似乎应该有效。为了首先给你一个概述,我正在使用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个窗口而不是打开一个,等待五秒钟,然后打开另一个窗口。崩溃的城市。
那我在这里错过了什么?如果真的很简单,我甚至可以自己踢。
答案 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();