我为我的ip扫描程序应用程序创建了一个线程。现在,当用户单击开始按钮时,它将启动线程,执行扫描并生成ID。
ID | printer_ip
---------------
1 | 10.0.0.0
2 | 10.0.0.1
3 | 10.0.0.2
但问题是当用户想要在上一个流程完成之前再次重新点击开始按钮重新扫描时,看起来ID会变得一团糟。
ID | printer_ip
---------------
1 | 10.0.0.0
4 | 10.0.0.3
2 | 10.0.0.1
我注意到这是因为旧线程在新线程运行时仍在运行。因此,每当用户重新单击开始扫描按钮时,如何杀死旧线程?我可以使用Thread.Abort()方法吗?如果是的话,我应该把它放在哪里?
private void StartClick(object sender, System.EventArgs e)
{
sercher = new Thread(new ThreadStart(Serche));
try
{
IPAddress from = IPAddress.Parse(ipFrom.Text);
IPAddress to = IPAddress.Parse(ipTo.Text);
}
catch (FormatException fe)
{
MessageBox.Show(fe.Message);
return;
}
sercher.Name = "Network searching thread";
sercher.Start();
//add.Items.Add("-->> >>> Please wait while processing is done <<< <<--");
Thread.Sleep(1);
}
答案 0 :(得分:3)
杀死线程的正确方法是使用标志。检查线程中的标志,如果引发则退出。例如:
while (!IsCancelled)
{
//Scan a single IP here...
}
点击&#34;开始&#34;再次,你应该首先提升标志(IsCancelled = true),调用Thread.Join等待该线程停止,然后再次启动该线程。
P.S。不要试图使用Thread.Abort! 非常非常坏。