【问题标题】:C# Ping crashes entire programC# Ping 使整个程序崩溃
【发布时间】:2012-04-03 21:17:05
【问题描述】:

我正在构建一个 C# windows 窗体应用程序,该应用程序按用户可以指定的名称 ping 多台计算机。

我正在使用 System.Net.NetworkInformation.Ping 类和 SendAsync 方法,以及处理结果的方法。

当用户指定一个不存在的计算机名称时,就会出现我遇到的问题。但是,我在 Application.Run(new Form()) (整个表单的主要方法)处获得了 TargetInvocationException,而不是 Ping 向我的回调方法返回错误。我试过用 try/catch 来包围相关代码,但他们似乎从来没有捕捉到异常

这里是 ping 的相关代码:

Ping p = null;
try
{
    p = new Ping();
    p.PingCompleted += new PingCompletedEventHandler (updateUI);
    p.SendAsync(computername, 10, computername);
}
    catch (Exception)
{
    ((IDisposable)p).Dispose();
    MessageBox.Show("Ping Failed...");
}

【问题讨论】:

  • 看一下TargetInvocationException的InnerException的StackTrace,看看异常是从哪里来的。
  • 或者尝试在单独的线程上使用 Send 代替
  • 检查您的 PingCompletedEventHandler。您正在执行此异步操作,因此并非所有内容都发生在您的 try catch 块中。您的事件将单独生成。

标签: c# winforms ping


【解决方案1】:

首先在 PingCompleted 事件处理程序中检查 e.Error 属性。当它不为空时尝试使用其他属性是有保证的。来自 MSDN 中的 PingCompletedEventArgs.Error 属性文档:

如果在异步操作期间引发异常,该类会将异常分配给 Error 属性。客户端应用程序的事件处理程序委托应在访问派生自 AsyncCompletedEventArgs 的类中的任何属性之前检查 Error 属性;否则,该属性将引发 TargetInvocationException,其 InnerException 属性包含对 Error 的引用。

【讨论】:

    【解决方案2】:

    好吧,既然您的异常处理程序没有被命中,它一定是在发生错误的代码的另一部分中。

    【讨论】:

    • SendAsync 可以在 try/catch 块之外抛出异常
    • 无论你多么努力地试图让别人为自己思考......别人总是不得不毁掉结局。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多