C# 如何停止递归循环?
我的意思不是暂停并继续,而是取消/停止。 要暂停并继续,我将在表格1的顶部使用此选项:C# 如何停止递归循环?,c#,C#,我的意思不是暂停并继续,而是取消/停止。 要暂停并继续,我将在表格1的顶部使用此选项: System.Threading.ManualResetEvent _busy = new System.Threading.ManualResetEvent(true); 然后,在按钮中,我正在忙着重置();和_busy.Set();暂停并继续。 但是如果我想完全停止/取消重现循环 这是递归循环代码: private List<string> test(string url, int leve
System.Threading.ManualResetEvent _busy = new System.Threading.ManualResetEvent(true);
然后,在按钮中,我正在忙着重置();和_busy.Set();暂停并继续。
但是如果我想完全停止/取消重现循环
这是递归循环代码:
private List<string> test(string url, int levels,DoWorkEventArgs eve)
{
_busy.WaitOne();
if (cancel == true)
{
}
this.Invoke(new MethodInvoker(delegate { label3.Text = label3.Text = (Int32.Parse(label12.Text) + Int32.Parse(label10.Text)).ToString(); }));
HtmlWeb hw = new HtmlWeb();
List<string> webSites;
List<string> csFiles = new List<string>();
csFiles.Add("temp string to know that something is happening in level = " + levels.ToString());
csFiles.Add("current site name in this level is : " + url);
try
{
this.Invoke(new MethodInvoker(delegate { ColorText.Texts(richTextBox1, "Level: " + levels.ToString(), Color.Green); }));
this.Invoke(new MethodInvoker(delegate { ColorText.Texts(richTextBox1, " Loading The Url: " , Color.Red); }));
this.Invoke(new MethodInvoker(delegate { ColorText.Texts(richTextBox1, url + "...",Color.Blue); }));
HtmlAgilityPack.HtmlDocument doc = TimeOut.getHtmlDocumentWebClient(url, false, "", 0, "", "");
this.Invoke(new MethodInvoker(delegate { ColorText.Texts(richTextBox1, " Done " + Environment.NewLine, Color.Red); }));
currentCrawlingSite.Add(url);
webSites = getLinks(doc);
removeDupes(webSites);
removeDuplicates(webSites, currentCrawlingSite);
removeDuplicates(webSites, sitesToCrawl);
if (removeExt == true)
{
for (int i = 0; i < webSites.Count; i++)
{
webSites.Remove(removeExternals(webSites));
}
}
if (downLoadImages == true)
{
webContent.retrieveImages(url); }
}
if (levels > 0)
sitesToCrawl.AddRange(webSites)
this.Invoke(new MethodInvoker(delegate { label7.Text = sitesToCrawl.Count.ToString(); }));
this.Invoke(new MethodInvoker(delegate { label12.Text = currentCrawlingSite.Count.ToString(); }));
if (levels == 0)
{
return csFiles;
}
else
{
for (int i = 0; i < webSites.Count(); i++)//&& i < 20; i++) {
string t = webSites[i];
if ((t.StartsWith("http://") == true) || (t.StartsWith("https://") == true))
{
csFiles.AddRange(test(t, levels - 1, eve));
}
}
return csFiles;
}
}
catch
{
failedUrls++;
this.Invoke(new MethodInvoker(delegate { label10.Text = failedUrls.ToString(); }));
this.Invoke(new MethodInvoker(delegate { ColorText.Texts(richTextBox1, " Failed " + Environment.NewLine, Color.Green); }));
return csFiles;
}
}
尝试添加break代码>但它不是为或当你不能使用中断
我怎么做
谢谢。好的,我会发布一个完整的答案:-)
递归函数的问题是,它们是递归的。只要你不知道什么时候退出,它就会永远运行。
所以你需要的是一个完成它的条件。由于该方法一次又一次地调用它自己,因此基本上需要再次进入调用堆栈并返回一些东西,就像在任何其他应该返回一些东西的方法中通常所做的那样。
贴出了一个小例子
因此,为了退出递归循环,您需要一个正确的return语句并返回所需的内容:
if (cancel)
{
return new List<string>();
}
if(取消)
{
返回新列表();
}
很明显,您会将所需的一切都放在列表中;-) 使用适当的return语句,例如:returnnewlist();如果您编写了一个没有结尾的递归函数,那么您就处于危险的境地。递归函数只有在退出“策略”已编码到其中时才起作用。使用返回代码>语句,其中代码需要停止并返回到它的前一个语句(这将依次调用return;
,等等…),否则将导致堆栈溢出…return new List();他正在工作。
if (cancel)
{
return new List<string>();
}