2012-04-03 3 views
0

Я создаю приложение формы Windows C#, которое пингует несколько компьютеров по имени, которое пользователь может указать.C# Ping завершает работу всей программы

Я использую класс System.Net.NetworkInformation.Ping и метод SendAsync с помощью метода обработки результата.

Проблема, с которой я столкнулась, возникает, когда пользователь указывает имя компьютера, которое не существует. Однако вместо того, чтобы Ping возвратил ошибку моему методу обратного вызова, я получаю исключение TargetInvocationException в Application.Run (new Form()) (основной метод всей формы). Я попытался окружающие соответствующий код с TRY/улова, но они никогда не поймать за исключением

Вот соответствующий код для пинг:

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..."); 
} 
+2

Посмотрите на StackTrace внутреннего исключения исключения TargetInvocationException, чтобы узнать, откуда исходит исключение. – dtb

+0

Или попробуйте использовать Отправить вместо этого в отдельной теме –

+0

Проверьте свой PingCompletedEventHandler. Вы делаете это асинхронно, поэтому не все происходит внутри блока catch try. Ваше событие будет появляться отдельно. – JamieSee

ответ

2

Проверьте свойство e.Error сначала в обработчике событий PingCompleted. Попытка использовать другие свойства, когда это не null, является гарантированным kaboom. Из документации по свойствам PingCompletedEventArgs.Error в MSDN:

Если в ходе асинхронной операции возникает исключение, класс присваивает исключение свойству Error. Делегат обработчика событий клиентского приложения должен проверить свойство Error перед доступом к любым свойствам класса, производного от AsyncCompletedEventArgs; в противном случае свойство будет вызывать TargetInvocationException со своим свойством InnerException, содержащим ссылку на Error.

0

Ну, так как ваш обработчик исключений не получает удар, он должен быть в другая часть вашего кода, где происходит ошибка.

+0

SendAsync может генерировать исключение за пределами блока try/catch. –

+2

Не имеет значения, насколько сложно вы пытаетесь заставить кого-то думать сами за себя. Кто-то всегда должен испортить окончание. –

Смежные вопросы