线程休眠和设置超时问题

Thread Sleep and setTimeout issues

本文关键字:超时 问题 设置 休眠 线程      更新时间:2023-09-26

我确定我可能在这里缺少一些逻辑元素,但从表面上看,我正在做的事情应该有效。 为了首先为您提供一个概述,我使用 vb.net 循环浏览网格视图并提取我存储在会话变量中的值。 然后,它通过 javascript 打开一个页面,并使用打开的页面上的会话变量从填充页面的数据库中提取数据。 它从被覆盖的渲染函数中抓取 HTML,并将其拉入到文件中。

其中大部分效果很好,但问题是,当我在循环中使用 Thread.Sleep 时,它会在所有页面的总持续时间内休眠 - 例如,如果我打开 10 个页面并且有 5 秒的睡眠时间,线程会停止 50 秒,然后快速触发 window.open。如果我使用 javascript 并设置超时暂停 5 秒,它会在第一次通过,但再次快速触发网格视图中的其余文档。

这是我目前拥有的:

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个窗口,而不是打开一个,等待五秒钟,然后打开另一个。 崩溃的城市。

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

由于它们都等待 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();