2013-09-04 3 views
0

Я уверен, что, вероятно, у меня, вероятно, отсутствует какой-то логический элемент, но на первый взгляд кажется, что я работаю. Чтобы сначала дать вам обзор, я использую vb.net для циклического просмотра сетки и вытягивания значений, которые храню в переменных сеанса. Затем он открывает страницу через javascript и использует переменные сеанса на открытой странице, чтобы извлекать данные из базы данных, заполняющей страницу. Он сбрасывает HTML из переопределенной функции Render и вставляет ее в файл.Проблемы со сном и setTimeout

Большинство из них хорошо работает, но проблема в том, что когда я использую 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

Поскольку все они ждут 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(); 
+0

Возможно ли иметь тайм-аут в качестве переменной, которую я просто добавляю 5000 с каждым проходом через петлю? Я просто не уверен, могу ли я эффективно использовать такую ​​функцию, всегда открывая одну и ту же страницу, и количество раз, когда она открывается, является динамичной. – Endyo

+0

HUH !? он не открывает одну и ту же страницу каждый раз. Он снимает его с массива! Вы бы создали массив, лучше, чем добавление 5000 тегов скрипта на страницу. Плюс, как долго вы будете сидеть там. 5000 * 5 секунд = 25 000 секунд = 416,17 мин = 6,94 часа. Плюс, если вы их не закрываете, вы получите проблемы с памятью. :) – epascarello

+0

Нет, я имел в виду, что каждый раз открываю ту же страницу. Он открывает страницу формы, и данные заполняются из базы данных. Это будет долгий процесс, но среднее количество страниц, которое он откроет (каждые две недели), составит около ста. Это в основном процедура автоматизации для чего-то, что намного проще сделать вручную ... – Endyo

Смежные вопросы