代码之家  ›  专栏  ›  技术社区  ›  Orion Edwards

BitmapCache导致WPF应用程序锁定

  •  4
  • Orion Edwards  · 技术社区  · 14 年前

    下面是场景:

    1:我们的WPF应用程序启动

    2:WPF应用程序加载各种用户控件,包括一些使用新的 BitmapCache WPF 4中的功能

    3:按ctrl alt delete或win+l或加载另一个需要UAC的应用程序

    4:取消那些东西

    WPF应用程序现在没有响应,但问题出在WPF本身。所有后台线程上的所有应用程序逻辑都很好,您可以通过按alt+f4等进行交互,但是 屏幕从不重画

    注意事项:

    • 如果您在这一点上闯入调试器, 用户代码运行,都是wpf
    • 杀死dwm.exe将使应用程序恢复生机
    • 如果我们拿出 位图缓存 D元素,它不会锁定
    • 我做了另一个使用BitmapCache的简单示例应用程序,它没有显示出问题。

    救命!!

    2 回复  |  直到 14 年前
        1
  •  0
  •   ProfyTroll    14 年前

    这个问题似乎很难重现。我只能建议高级调试-

    • 确保堆栈跟踪浏览器“显示外部代码”(堆栈跟踪vs中的右键菜单)。然后在WPF内部找到应用程序被卡住的确切位置。
    • 下一步是为该程序集或更简单的.NET Reflector加载PDB。
    • 很多寻找和思考…
    • ????
    • 利润!

      :)

        2
  •  0
  •   Orion Edwards    14 年前

    经过很多努力,一个同事终于找到了这个问题。

    我们的应用程序最初显示一个登录窗口,然后关闭它,并显示一个主窗口。我们很久以前发现,如果您这样做,wpf假定第一个窗口(登录窗口)是应用程序的主窗口,因此当它关闭时,它会关闭。

    为了缓解这种情况,我们在任何其他窗口之前创建了一个假屏幕外窗口(从未显示)。然后,wpf假设这个假窗口是主窗口——它永远不会关闭,所以我们的应用程序可以根据需要工作。

    作为参考,假窗口如下所示:

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

    一切都很好。稍后,另一个开发人员向 Show Hide 这扇假窗户。

    显示主窗口是导致它的原因。


    这是一份完整的报告:

    A:在Visual Studio中创建新的WPF应用程序

    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>
    
    1. 运行这个程序(我在Windows7上),然后按ctrl+alt+del,或者弹出一个UAC提示。

    你会看到这个应用程序像问题中描述的那样被锁定——在m_主窗口中评论。show修复了它。

    更新:

    经过进一步调查,这不是 只是 显示窗口,事实上 ShowInTaskBar 设置为假。如果不设置,则显示窗口不再导致问题。

    奇怪的!