Windows Phone 7 - Обработка ошибки в Application_UnhandledException с WebClient - PullRequest
2 голосов
/ 02 июня 2011

Мне нужно обработать исключение в событии Application_UnhandledException файла App.xaml.cs. Я получаю объект Exception, используя e.ExceptionObject. Теперь мне нужно отправить сведения об исключении на мой сервер с помощью службы WCF с помощью WebClient.

Всякий раз, когда я отправляю запрос службе WCF с помощью WebClient, он отправляет запрос, но происходит событие обратного вызова, например, webClient_UploadStringCompleted никогда не выполняется. Я прочитал, что исключения обрабатываются в отдельном потоке и т. Д.

То, что я уже пробовал, но не удалось:

  1. ThreadStart
  2. Тема
  3. App.Current.RootVisual.Dispatcher.BeginInvoke
  4. RootFrame.Dispatcher.BeginInvoke
  5. System.Windows.Deployment.Current.Dispatcher.BeginInvoke
  6. Deployment.Current.Dispatcher.BeginInvoke

Кто-нибудь может рассказать, как отправить подробности ошибки из Application_UnhandledException в службу WCF с WebClient?

Код:

// Код для выполнения в необработанных исключениях

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{

e.Handled = true;

// Option 1
Thread thread = new Thread(() => MainPage.HandleException(e.ExceptionObject));
thread.Start();
ThreadStart start = new ThreadStart(NonUIWork);

// Option 2
Thread thread = new Thread(start);
thread.Start(e.ExceptionObject);

// Option 3
Deployment.Current.Dispatcher.BeginInvoke(delegate { MainPage.HandleException(e.ExceptionObject); }); 

// Option 4
App.Current.RootVisual.Dispatcher.BeginInvoke(MainPage.HandleException, e.ExceptionObject);

// Option 5
RootFrame.Dispatcher.BeginInvoke(() => { MainPage.HandleException(e.ExceptionObject); });

// Option 6
MainPage.HandleException(e.ExceptionObject); 
}

В методе MainPage.HandleException я отправляю сведения об исключении в службу WCF с объектом WebClient. Но функция обратного вызова WebClient (webClient_UploadStringCompleted) никогда не выполняется. Похоже, что поток, в котором выполняется событие Application_UnhandledException, немедленно приостанавливается.

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

вы можете сохранить исключение с помощью IsolatedStorage в Windows Phone, а при повторном запуске приложения вы можете отправить описание ошибки с помощью асинхронного вызова

1 голос
/ 02 июня 2011

Да, это не может сработать. Событие возникает, когда CLR завершает работу AppDomain, непосредственно перед тем, как он будет выгружен. Вы не можете ожидать, что какой-либо поток или асинхронная операция завершится. Весь ваш код должен быть выполнен к моменту выхода из вашего обработчика событий. Обязательно используйте синхронные методы и избегайте одновременного использования потоков. В обычном коде «не блокировать пользовательский интерфейс» нет никакого смысла, к моменту возникновения события пользовательского интерфейса больше нет.

Это действительно проблема для Windows Phone, у нее нет синхронных методов WebClient, таких как WebClient.UploadString (). Вы должны будете сделать UploadStringAsync () синхронным самостоятельно, используя AutoResetEvent. Вызвать его метод WaitOne () после вызова загрузки, вызвать его метод Set () в обратном вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...