2010-06-18 3 views
0

После некоторого поиска в обработке исключений в Silverlight и чтения некоторых полезных блогов, подобных этому Silverlight exception handling using WCF RIA Services and WCF Services В результате я создал аналогичную идею в App.xaml.cs, чтобы показать страницу с ошибкой и вызвать другой метод службы WCF, чтобы зарегистрировать ошибку в окне просмотра событий:Как остановить работу wcf-сервисов в Silverlight при возникновении исключения

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
    { 
     if (!System.Diagnostics.Debugger.IsAttached) 
     { 
      var errorPage = new Error(); 
      errorPage.Show(); 

      string errorMsg = string.Format("{0} {1}", e.ExceptionObject.Message, e.ExceptionObject.StackTrace); 
      EventHandler<WriteIntoEventLogCompletedEventArgs> callback = (s, ev) => 
      { 
       bool result = ev.Result; 
      }; 
      (new ServiceProxy<ApplicationServiceClient>()).CallService<WriteIntoEventLogCompletedEventArgs>(callback, errorMsg); 

      e.Handled = true; 
     } 
    } 

и это то, что я имею в Error.xaml.cs:

private void OKButton_Click(object sender, RoutedEventArgs e) 
{ 
     this.DialogResult = true; 
} 

, что в основном будет закрывать страницу ошибки когда пользователь нажимает OK.

Все работает отлично в большинстве случаев. Проблема возникает, когда один из обратных вызовов службы wcf вызывает исключение. Страница ошибки будет отображаться красиво, и когда пользователь нажимает кнопку ОК, страница с ошибкой закрывается. Но фон по-прежнему показывает индикатор занятости, а исходный обратный вызов службы все еще ждет ответа. Мне нужно как-то его прекратить.

Я был бы appriciative, если бы кто-нибудь мог помочь.

Спасибо, Sil

-

Большое спасибо за ваш полезный reply.I использовал ту же самую идею и в методе обратного вызова оригинального сервиса добавлен код для проверки e.Error и если это не null, закройте окно (это дочернее окно) с занятым указателем, и теперь все работает отлично. Еще раз спасибо. Sil

ответ

0

Я предполагаю, что первоначальный обратный вызов службы может завершаться, но в состоянии ошибки. Возможно, вам придется обнаружить условие ошибки и установить для свойства IsBusy для занятого индивидуума значение False.

Пара вещей, чтобы проверить

  • Является ли исходная услуга обратного вызова по крайней мере возвращения успешно? Вы можете проверить это, поставив точку останова в исходный метод обратного вызова службы.

  • Вы правильно обработали условие ошибки в методе обратного вызова. Например -


void proxy_GetUserCompleted(object sender, GetUserCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      getUserResult.Text = "Error getting the user."; 
     } 
     else 
     { 
      getUserResult.Text = "User name: " + e.Result.Name + ", age: " + e.Result.Age + ", is member: " + e.Result.IsMember; 
     } 
    } 

Ссылка - http://msdn.microsoft.com/en-us/library/cc197937(v=VS.95).aspx

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