基本上,我有一个带有按钮的表单,当按下按钮时,它会创建一个运行线程的类的实例。当线程完成时,它会自动调用Thread.Abort()。
我目前拥有的代码如下:
按钮:
private void Buttonclick(object sender, EventArgs e)
{
MyClass c = new MyClass()
c.Do_your_thing();
}
类:
public class MyClass
{
Thread t;
public void Do_your_thing()
{
t = new Thread(Running_code);
t.Start();
}
private void Running_code()
{
//Perform code here
t.Abort();
}
}
当我点击按钮一次时,一切正常。但是当我再次按下按钮时,什么也没有发生。
如果我不使用t.Abort(),则一切都正常。但是不使用t.Abort()会导致内存泄漏,程序无法正确关闭(线程未关闭,因此进程将保持活动状态)。
有人可以解释一下发生了什么吗?我该如何修复它?
编辑:根据要求,我发布一些实际代码。
public class MyClass
{
public void Test()
{
t = new Thread(() =>
{
wb.DocumentCompleted += get_part;
wb.Navigate("http://www.google.com");
Application.Run();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
public void get_part(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var br = sender as WebBrowser;
string url = e.Url.ToString();
//Here is some code that compares the url to surten predefined url. When there is a match, it should run some code and then go to a new url
if(url == string_final_url)
{
//Finally at the url I want, open it in a new Internet Explorer Window
Process proc = Process.Start("IExplore.exe", url);
}
}
}
这是一个小型网页爬虫程序的一部分。它导航到需要一些登录信息的网页。当我抵达实际想要的页面时,它应该在新的Internet Explorer中打开。
当我调用这段代码并关闭表单后,它仍然在进程树中可见。当我多次点击按钮时,使用的内存不断增加,我怀疑这是某种内存泄漏。
t.Join()
代替Abort
。 - Jahan ZinedineThread.Abort()
。你会后悔的。) - Matthew Watsont.Abort()
的情况下也可以正常工作。 - Matthew Watsonreturn
(或达到最后的}
)应该足以终止该线程。 - Damien_The_UnbelieverAlbahari
第一页中部分有一个关于"前台线程和后台线程"的章节。请注意,如需进一步了解,请访问原网站。 - Nick Butler