У нас есть приложение WPF на основе навигации.
Работает нормально при запуске напрямую из Visual Studio,
или даже если мы скопируем файлы в другой каталог или на другой компьютер и запустим его там.
Мы разворачиваем приложение через Интернет, используя ClickOnce и большинство
времени это не вызывает никаких проблем.
Время от времени, однако, он просто полностью зависает, и вы получаете
классический «Приложение xxxx не отвечает» и пользовательский интерфейс без ответа.
Это происходит не каждый раз, а только при использовании развернутой версии.
(Даже если мы проверим это на компьютере разработчика).
Когда я набираю это сообщение, мы запускаем и покидаем развернутую версию
много раз, чтобы попытаться воспроизвести поведение ... иногда это будет происходить 10 раз подряд, а затем оно будет работать нормально в течение следующих 20 раз. Без указания того, что может быть причиной. (Только удалось это сделать)
Просто чтобы показать вам, что я имею в виду, вот скриншот:
[] [пустой]
Это произошло при двойном щелчке по первому элементу в ListBox:
LLCOverviewPage llcOverview = new LLCOverviewPage((Controller)this.lstControllers.SelectedItem);
this.NavigationService.Navigate(llcOverview);
Приложение просто остается в этом состоянии навсегда, исключение не выдается.
Конструктор для LLCOverViewPage выглядит следующим образом:
public LLCOverviewPage(Controller CurrentController)
{
InitializeComponent();
this.currentController = CurrentController.ToLightLinkController();
this.updateControllerInfo();
}
Метод updateControllerInfo () отображает информацию на странице,
а затем вызывает метод больше информации, которая была загружена ранее
из базы данных SQL Compact 3.5:
private void updateControllerInfo()
{
//Update the UI with general properties
this.lblDeviceName.Content = this.currentController.ShortName;
this.lblEthernetAddress.Content = this.currentController.Eth0.EthernetAddress.ToString();
this.lblTcpPort.Content = this.currentController.Eth0.TcpPort.ToString();
this.lblActuatorThroughputMode.Content = (this.currentController.Dali.ActuatorThroughputMode ? "Enabled" : "Disabled");
this.lblNetmask.Content = (this.currentController.Eth0.Netmask != null ? this.currentController.Eth0.Netmask.ToString() : String.Empty);
this.lblDefaultGateway.Content = (this.currentController.Eth0.DefaultGateway != null ? this.currentController.Eth0.DefaultGateway.ToString() : String.Empty);
//Update the UI with the ballasts
this.updateBallastList();
}
private void updateBallastList()
{
this.lstBallasts.ItemsSource = null;
List<BallastListViewItem> listviewItems = new List<BallastListViewItem>();
foreach (DaliBallast ballast in this.currentController.Dali.Ballasts.OrderBy(b => b.ShortAddress))
{
listviewItems.Add(new BallastListViewItem(ballast,this.currentController.SerialNumber));
}
this.lstBallasts.ItemsSource = listviewItems;
}
Вот и все. Больше ничего не происходит, когда страница построена.
Без исключения и, так как приложение не падает,
У меня очень мало времени, чтобы понять, что происходит не так.
База данных SQL Compact хранится в папке приложения пользователя,
поэтому развернутая версия использует ту же базу данных, что и обычная версия,
Там нет никакой разницы.
Так что, для ясности, эта проблема возникает ТОЛЬКО в развернутой версии!
(Проверено на разных компьютерах с Windows XP и Windows Vista)
Любые идеи о том, что может вызывать нечто подобное,
или что я могу попробовать, чтобы отследить эту проблему?
UPDATE
Использование старой доброй отладки (запись информации журнала в файл)
Я был в состоянии определить весь мой код успешно исключений и
приложение только зависает после этого.
Итак, если вы еще раз посмотрите на конструктор создаваемой страницы:
public LLCOverviewPage(Controller CurrentController)
{
InitializeComponent();
this.currentController = CurrentController.ToLightLinkController();
this.updateControllerInfo();
}
После this.updateControllerInfo (), где приложение зависает
время от времени. Будет ли это что-то за пределами моего кода? Возможно, ошибка WPF?
Обновление 2
Я проверил Application EventLog в Windows, вот что он говорит:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Application Hang" />
<EventID Qualifiers="0">1002</EventID>
<Level>2</Level>
<Task>101</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2008-11-04T15:55:55.000Z" />
<EventRecordID>1630</EventRecordID>
<Channel>Application</Channel>
<Computer>DEVTOP</Computer>
<Security />
</System>
<EventData>
<Data>LLCControl.exe</Data>
<Data>1.0.0.0</Data>
<Data>2f4</Data>
<Data>01c93e95c29f9da5</Data>
<Data>20</Data>
<Binary>55006E006B006E006F0077006E0000000000</Binary>
</EventData>
</Event>
Двоичный текст гласит: НЕИЗВЕСТНО, думаю, я полностью запутался ...
ОБНОВЛЕНИЕ 3
Если я изменю код обработчика событий для списка на этот:
LLCOverviewPage llcOverview = new LLCOverviewPage((Controller)this.lstControllers.SelectedItem);
MessageBox.Show("Navigating Now");
this.NavigationService.Navigate(llcOverview)
показывает, что приложение зависает только при навигации!
ОБНОВЛЕНИЕ 4
Я подключил несколько обработчиков событий к NavigationService. Обработчики просто записывают в журнал, когда события запускаются. Результат выглядит так:
17: 51: 35 Навигация
17:51:35 Навигация
17:51:35 LoadCompleted
Так почему же это забвение?