我會先注意到你的條件表達式的兩邊似乎都不受循環體的影響;也就是說,在循環體內,UrlList.Count
和setting_EPP
似乎都不會改變。有可能load_page()
或table_populate()
函數改變了某些東西,或者另一個線程改變了某些東西,但是現在我會認爲這是真的,因爲這個問題似乎沒有什麼意義,否則(我保證:條件檢查是不是您的表現的重要或可測量因素)。
鑑於此,問題仍不清楚,但我將其歸結爲兩種可能性。一個是你只需要在循環開始時加載表格。這很容易;進入循環體之前叫它:
int x = 1;
load_page(standurl, 0);
firstentryOnload = UrlList[0];
if (UrlList.Count > setting_EPP) table_populate(0);
for (int i = 1; i <= lastPage; i++)
{
System.Threading.Thread.Sleep(delay);
load_page(standurl, i);
if (x > 10)
{
//refresh firstpage,check for new data
System.Threading.Thread.Sleep(delay);
x = 1;
}
x++;
}
另一種可能性是,你想,如果條件滿足在每個迭代上運行它,但只是想避免一遍又一遍地檢查的條件。在這種情況下,你可以包住整個事情在單一if()
塊:
int x = 1;
load_page(standurl, 0);
firstentryOnload = UrlList[0];
if (UrlList.Count > setting_EPP)
{
for (int i = 1; i <= lastPage; i++)
{
table_populate(0);
System.Threading.Thread.Sleep(delay);
load_page(standurl, i);
if (x > 10)
{
//refresh firstpage,check for new data
System.Threading.Thread.Sleep(delay);
x = 1;
}
x++;
}
}
else
{
for (int i = 1; i <= lastPage; i++)
{
System.Threading.Thread.Sleep(delay);
load_page(standurl, i);
if (x > 10)
{
//refresh firstpage,check for new data
System.Threading.Thread.Sleep(delay);
x = 1;
}
x++;
}
}
,當然,你可以抽象出最重複的代碼到一個單獨的方法。
實際上,還有第三種可能性。我可能是錯的,並且在循環過程中UrlList
或setting_EPP
發生了變化,並且您只是想在條件成爲第一次時運行它,而無需在每次迭代時進行檢查。在這種情況下,你可以這樣做:
int i = 1;
while (i <= lastPage && UrlList.Count <= setting_EPP)
{
System.Threading.Thread.Sleep(delay);
load_page(standurl, i);
if (i % 10 == 0) System.Threading.Thread.Sleep(delay);
i++;
}
if (i <= lastPage && UrlList.Count > setting_EPP) table_populate(0);
while (i <= lastPage)
{
System.Threading.Thread.Sleep(delay);
load_page(standurl, i);
if (i % 10 == 0) System.Threading.Thread.Sleep(delay);
i++;
}
難道你不能剛剛得到的邏輯循環? – Darshana
將'if'語句移到循環之外? 'if(UrlList.Count> setting_EPP)table_populate(0); for(int i = 0 ....)' –
我一直在試圖弄清楚如何將它帶出循環,但是這是在後臺線程中運行的。所以Id必須要時間嗎?或者,也許我可以創建一個只會觸發一次的事件?但我相信這隻會導致我有不同的陳述。 代碼永遠運行直到程序關閉或它到達最後一頁(大約11200頁,每頁約1.3秒(約4小時)) –