0

IPの存在を確認するために、ネット3.5でpingライブラリを使用しています。

以下のコードを見てください。

    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();

さて、問題は次のとおりです。

スレッドを開始すると、アプリケーションを閉じます (隅にあるコントロールボックスで閉じます)。スレッドを閉じたり中止したりしても、「App Crash」が発生します。

問題はイベントハンドラだと思いますか? 「アプリクラッシュ」が発生するように、アプリケーションを閉じているときにまだ機能しているため

このケースを解決する最善の方法は何でしょうか?

4

1 に答える 1

0

Ping が成功すると、スレッド内からインターフェイスを更新しようとしていると思います。これにより、CrossThreadingOperation 例外が発生します。

Web で ThreadSave / デリゲートを検索します。

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 に答える