基本的に、ボタンを含むフォームがあります。ボタンを押すと、スレッドを実行するクラスのインスタンスが作成されます。スレッドが完了すると、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();
}
}
ボタンを 1 回クリックすると、すべてが機能します。しかし、もう一度ボタンを押しても何も起こりません。
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);
}
}
}
これは小さな webscraper プログラムの一部です。ログイン情報が必要な Web ページに移動します。私が実際に表示したいページにたどり着いたら、彼はそれを新しい Internet Explorer で開く必要があります。
このコードを呼び出してフォームを閉じると、プロセス ツリーに表示されたままになります。また、ボタンを複数回クリックすると、使用されるメモリが増え続けます。これは、何らかのメモリ リークであると思われます。