BitmapCache导致WPF应用程序锁定

时间:2010-09-03 01:01:22

标签: c# wpf

以下是该方案:

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

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

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

4:取消那些东西

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

注意事项:

  • 如果您此时闯入调试器,则没有用户代码正在运行,它都是WPF
  • 杀死DWM.exe使应用程序恢复生机
  • 如果我们取出BitmapCache d个元素,它就不会锁定
  • 我制作了另一个使用BitmapCache的简单示例应用程序,它没有出现问题。

帮助!!

2 个答案:

答案 0 :(得分:0)

似乎问题难以重现。我可以建议的是高级调试 -

  • 确保堆栈跟踪浏览器“显示外部代码”(堆栈跟踪中VS中的右键菜单)。然后找到应用程序停滞的WPF内部的确切位置。
  • 下一步是为该程序集加载pdb或更简单 - 使用.NET Reflector。
  • 很多观察和思考......
  • ???
  • PROFIT!

    :)

答案 1 :(得分:0)

经过艰苦的努力,一位同事终于成功地追踪了这一点。

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

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

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

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

这一切都很好。一段时间后,另一位开发人员向ShowHide这个假窗口添加了一些代码。

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


这是一个完整的复制品:

答:在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. 运行此程序(我在Windows 7上),然后按ctrl + alt + del,或调出UAC提示符。
  2. 您会看到该应用似乎已锁定,如问题中所述 - 注释掉m_mainWindow.Show修复它。

    更新

    经过一些进一步的调查后,它不是只是显示窗口,而是ShowInTaskBar设置为false的事实。如果我们不设置,那么显示窗口不再导致问题。

    奇妙!