0

我正在使用 net 3.5 中的 ping 库来检查 IP 的存在。

看看下面的代码:

    public void PingIP(string IP)
    {
        var ping = new Ping();
        ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); //here the event handler of ping
        ping.SendAsync(IP,"a"); 
    }

void ping_PingCompleted(object sender, PingCompletedEventArgs e)
{
    if (e.Reply.Status == IPStatus.Success)
    {
       //On Ping Success
    }
}

然后我通过 Thread 或 backgroundworker 执行代码。

private void CheckSomeIP()
{
        for (int a = 1; a <= 255; a++)
        {
            PingIP("192.168.1." + a);
        }
}
System.Threading.Thread checkip = new System.Threading.Thread(CheckSomeIP);
checkip.Start();

那么问题来了:

如果我启动线程,那么我将关闭应用程序(在角落处使用 Controlbox 关闭),尽管我已经关闭/中止线程,但我会得到“应用程序崩溃”。

我认为问题是事件处理程序?因为当我关闭应用程序时它们仍在工作,所以我会得到“应用程序崩溃”

解决这种情况的最佳方法是什么?

4

1 回答 1

0

我认为,在成功 Ping 时,您正在尝试从线程内更新接口,这将导致 CrossThreadingOperation 异常。

在网上搜索 ThreadSave / delegates:

public void PingIP(string IP)
{
    var ping = new Ping();
    ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); //here the event handler of ping
    ping.SendAsync(IP,"a"); 
}

delegate void updateTextBoxFromThread(String Text);

void updateTextBox(String Text){
   if (this.textbox1.InvokeRequired){
       //textbox created by other thread.
       updateTextBoxFromThread d = new updateTextBoxFromThread(updateTextBox);
       this.invoke(d, new object[] {Text});
   }else{
      //running on same thread. - invoking the delegate will lead to this part.
      this.textbox1.text = Text;
   }
}

void ping_PingCompleted(object sender, PingCompletedEventArgs e)
{
    if (e.Reply.Status == IPStatus.Success)
    {
       updateTextBox(Text);
    }
}

同样在“退出”应用程序时,您可能希望取消所有正在运行的线程。因此,您需要在应用程序某处启动的每个线程上保留引用。在 Main-Form 的 formClosing-Event 中,您可以强制所有(正在运行的)线程停止。

于 2013-01-18T11:10:04.667 回答