Странное поведение при запуске развернутой версии приложения WPF ClickOnce - PullRequest
2 голосов
/ 04 ноября 2008

У нас есть приложение WPF на основе навигации. Работает нормально при запуске напрямую из Visual Studio, или даже если мы скопируем файлы в другой каталог или на другой компьютер и запустим его там.

Мы разворачиваем приложение через Интернет, используя ClickOnce и большинство времени это не вызывает никаких проблем.

Время от времени, однако, он просто полностью зависает, и вы получаете классический «Приложение xxxx не отвечает» и пользовательский интерфейс без ответа.

Это происходит не каждый раз, а только при использовании развернутой версии. (Даже если мы проверим это на компьютере разработчика).

Когда я набираю это сообщение, мы запускаем и покидаем развернутую версию много раз, чтобы попытаться воспроизвести поведение ... иногда это будет происходить 10 раз подряд, а затем оно будет работать нормально в течение следующих 20 раз. Без указания того, что может быть причиной. (Только удалось это сделать)

Просто чтобы показать вам, что я имею в виду, вот скриншот:

[alt text] [пустой]

Это произошло при двойном щелчке по первому элементу в 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

Так почему же это забвение?

1 Ответ

3 голосов
/ 05 ноября 2008

Мне удалось отследить проблему до кода вызывается, когда происходит привязка данных, что требует нового вопроса, найденного здесь:

Запрос SQL 2 LINQ (вызванный привязкой данных) полностью замораживает приложение WPF

...