BitmapCache вызывает блокировку приложения WPF - PullRequest
4 голосов
/ 03 сентября 2010

Вот сценарий:

1: наше приложение WPF запускается

2: приложение WPF загружает различные пользовательские элементы управления, в том числе те, которые используют новую функцию BitmapCache в WPF 4

3: нажмите ctrl-alt-delete или win + l или загрузите другое приложение, для которого требуется UAC

4: отмените этот материал

Приложение WPF теперь не отвечает, однако это WPFСамо по себе, что является проблемой.Вся логика приложения на всех фоновых потоках в порядке, и вы можете взаимодействовать с ней, нажимая alt + f4 и т. Д., Но экран никогда не перерисовывается

Примечания:

  • Если в этот момент вы вломились в отладчик, то не пользовательский код работает, все это WPF
  • Killing DWM.exe возвращает приложение к жизни
  • Если мы извлечем элементы BitmapCache d, он не заблокируется
  • Я сделал еще один простой пример приложения, в котором использовался BitmapCache, и проблема не возникла.

Помогите !!

Ответы [ 2 ]

0 голосов
/ 16 сентября 2010

После большой кропотливой работы коллеге наконец удалось отследить это.

Наше приложение сначала показывает окно входа в систему, затем закрывает его и показывает главное окно.Мы давно обнаружили, что если вы сделаете это, WPF предполагает, что первое окно (окно входа в систему) является главным окном приложения, и поэтому оно закрывается при закрытии.

Чтобы смягчить это, мы создалиподдельное закадровое окно (которое никогда не отображается) перед любыми другими окнами.Затем WPF предполагает, что это фальшивое окно является основным - оно никогда не закрывается, поэтому наше приложение может работать как нужно.

Для справки, фальшивое окно выглядит так:

m_mainWindow = new Window { Left = int.MaxValue, Top = int.MaxValue, Width = 1, Height = 1 };
m_mainWindow.ShowInTaskbar = false;

Это быловсе хорошо.Некоторое время спустя другой разработчик добавил код к Show и Hide этому фальшивому окну.

Показано главное окно, вызвавшее его.


Вот полное изображение:

A: Создайте новое приложение WPF в Visual Studio.

B: Добавьте следующий код в ваш класс App в App.xaml.cs

public partial class App : Application
{
    Window m_mainWindow;

    public App()
    {
        m_mainWindow = new Window { Left = int.MaxValue, Top = int.MaxValue, Width = 1, Height = 1 };
        m_mainWindow.ShowInTaskbar = false;

        // Comment this line out and the problem goes away
        m_mainWindow.Show();
    }
}

C: Положитехотя бы один элемент BitmapCached в вашем MainWindow.xaml.Вот мой

<Window x:Class="LockupRepro.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid CacheMode="BitmapCache">
        <Button Content="Look a button" />
    </Grid>
</Window>
Запустите эту программу (у меня Windows 7), а затем нажмите Ctrl + Alt + Del или вызовите приглашение UAC.

Вы увидите, что приложение заблокированокак описано в вопросе - комментирование m_mainWindow.Show исправляет его.

Обновление:

После дальнейшего изучения это не просто , показывающее окно, это факт, чтоShowInTaskBar имеет значение false.Если мы не установим это, то отображение окна больше не вызывает проблему.

Bizarre!

0 голосов
/ 07 сентября 2010

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

  • Убедитесь, что ваш браузер трассировки стека "Показывает внешний код" (меню правой кнопки в VS на трассировке стека).Затем найдите точное место внутри WPF, где застряло ваше приложение.
  • Следующим шагом является загрузка pdb для этой сборки или, что намного проще, - использование .NET Reflector.
  • Много взглядов и мыслей ...
  • ???
  • ПРИБЫЛЬ!

    :)

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