我想知道是否有人知道如何避免在以下代码中重新运行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&gt; setting_EPP
没有&#34; If / Then&#34;检查每个循环。
基本上我希望它运行If Statement一次然后停止存在。
我知道如何停止运行if / then语句,但我不希望它在运行后继续检查
编辑:循环在后台运行,目前大约需要4个小时才能完成。我一直试图找到一些方法把它放在循环之外,但是我没有太多运气。我唯一能想到的是运行上面代码的另一个线程,每隔几分钟运行一次If语句?
答案 0 :(得分:4)
您可以在委托中包装条件并在满足条件时替换委托:
Action check;
check = ()=> {
if (UrlList.Count > setting_EPP)
{
table_populate(0);
check = () => {}; // replace check with no-op.
}
};
....
for(...)
{
check();
...
}
此代码由经过培训的专业人士在封闭课程中编写,不要在家尝试(或任何非自学代码)。 :)子>
更传统的模式 - 有标志说'条件满足,不再检查&#34; - 但确实需要if
声明。
注意:如果此代码检查共享日期,则需要使用lock
或其他同步方法(即并发集合之一)。
答案 1 :(得分:3)
首先,我要注意条件表达式的两边似乎不受循环体的影响;也就是说,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++;
}