2015-10-29 59 views
1

我想知道是否有人知道我怎樣才能避免重新運行的聲明如果在下面的代碼怎樣才能避免如果/ then語句從檢查它的「IF」

int x = 1; 
load_page(standurl, 0); 
firstentryOnload = UrlList[0]; 
for (int i = 1; i <= lastPage; i++) 
{ 
    if (UrlList.Count > setting_EPP) 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++; 
} 

我想運行table_populate (0);當UrlList.Count> setting_EPP
沒有「If/Then」檢查Every Loop。

本質上我希望它運行If語句一次,然後停止存在。

我知道如何從運行停止的if/then語句,但我不希望它繼續檢查其運行

編輯後:迴路在後臺運行,目前需要約4小時運行完成。我一直在試圖找到一種方法將這個問題放在循環之外,但是我沒有多少運氣。我唯一能想到的就是運行另一個線程,運行上面的代碼,每隔幾分鐘運行一次If語句?

+0

難道你不能剛剛得到的邏輯循環? – Darshana

+1

將'if'語句移到循環之外? 'if(UrlList.Count> setting_EPP)table_populate(0); for(int i = 0 ....)' –

+0

我一直在試圖弄清楚如何將它帶出循環,但是這是在後臺線程中運行的。所以Id必須要時間嗎?或者,也許我可以創建一個只會觸發一次的事件?但我相信這隻會導致我有不同的陳述。 代碼永遠運行直到程序關閉或它到達最後一頁(大約11200頁,每頁約1.3秒(約4小時)) –

回答

4

您可以委託包裝,並更換代表時的條件是:

Action check; 
check =()=> { 
    if (UrlList.Count > setting_EPP) 
    { 
     table_populate(0); 
     check =() => {}; // replace check with no-op. 
    } 
    }; 
.... 
for(...) 
{ 
    check(); 
    ... 
} 

此代碼是通過在封閉線路訓練有素的專業人士寫的,不要在家裏嘗試(或任何非自教育代碼)。 :)

更傳統的模式 - 有說「條件符合,不再檢查」的標誌 - 但實際上它將需要if聲明。

注意:如果此代碼檢查共享日期,則需要使用lock或其他同步方法(即併發集合之一)。

+0

謝謝,唯一共享的數據是UrlList,但它唯一寫在這個循環中。 (我是否仍然使用Lock?)PS:這真的很聰明我永遠不會想到如果UrlList可以從您需要鎖定/同步的任何其他線程中讀取/更新,則可以用無操作替換委託人 –

+1

@JasonBrown。您可能想要顯示實際演示乳清「UrlList」更改的更完整示例 - 如果它在循環內部增長,那麼調用方法時更新的簡單「isTablePopulated」標誌將是最可讀的解決方案。 –

+0

爲了語法正確,我不得不將'check =()=> {};'改爲'check = delegate {};'不確定,但這兩個語句是否相同? –

3

我會先注意到你的條件表達式的兩邊似乎都不受循環體的影響;也就是說,在循環體內,UrlList.Countsetting_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++; 
    } 
} 

,當然,你可以抽象出最重複的代碼到一個單獨的方法。

實際上,還有第三種可能性。我可能是錯的,並且在循環過程中UrlListsetting_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++; 
} 
+0

謝謝對於響應,但是我無法在循環之前運行if,因爲Load_page是填充UrlList及其控制setting_EPP的用戶設置的東西(好吧,它實際上還沒有將其轉換爲設置,只是準備)雖然我知道只有1條或2條if語句不會造成很大的延遲,但是如果您只是在第一次成功時才需要運行它,那麼對每一個循環進行一次檢查就顯得浪費了。 –

+0

如果'load_page()'是填充UrlList的東西,我會對你的代碼做兩處設計修改。首先是讓'load_page()'返回加載的數據(你的UrlList)。第二種方法是使'load_page()'負責填充表。 –

+0

我讓它運行得像這樣,但我試圖分解代碼多一點,所以函數有點「功能」,(之前它調用了6個左右的方法鏈) –