在 App_Launching 中初始化的静态变量突然为 null

Static variable initialized in App_Launching suddenly null

Windows Phone 8 个项目。我有一个 class 包含对图像的引用。我在应用 class:

的 Launching 事件处理程序中初始化了上述引用
private void Application_Launching(object sender, LaunchingEventArgs e)
{
    TheClass.Load();
}

//Elsewhere...
class TheClass
{
    static private int[] s_Pixels = null;

    static public void Load()
    {
        BitmapImage bi = new BitmapImage(new Uri("/res/image.png", UriKind.Relative));
        bi.CreateOptions = BitmapCreateOptions.BackgroundCreation;
        bi.ImageOpened += OnImageLoaded;
        bi.ImageFailed += OnImageFailed;
    }

    private static void OnImageLoaded(object o, RoutedEventArgs a)
    {
        BitmapImage bi = o as BitmapImage;
        s_Pixels = new WriteableBitmap(bi).Pixels;
    }

    // And consumers call this one:
    static public WriteableBitmap GetImage()
    {
        if (s_Pixels == null)
            SendDebugReport();
    }
}

这段代码对我有用。然而我得到了那些调试报告,表明 s_Pixels 为空。我无法重现它,但我的用户显然可以。有一个代码路径导致 GetImage() 在没有事先调用 Load().

的情况下被调用

Load 没有被调用,不是我调用 LoadOnImageLoaded 从来没有发生过。

s_Pixels 任何地方都没有其他作业。

我会检查图像加载错误。有一个 ImageFailed 事件处理程序会留下日志跟踪。它从未被调用,为什么会被调用 - 有问题的图像在应用程序的资源中。

这怎么可能? Windows Phone 应用程序如何在不调用 Launching 的情况下初始化和加载?

Application_Launching 仅在您的应用程序重新启动时调用。如果你将它发送到后台,而系统最终将其逻辑删除,然后用户重新激活它,你的静态数据将消失,但 不会 被调用。相反,您会接到 Application_Activated.

的电话

所以,基本上,您需要 运行 在 LaunchingActivated 方法上进行所有静态初始化。

您很可能会通过使用 Visual Studio 强制应用程序的逻辑删除来重现用户遇到的问题:检查项目选项的“调试”选项卡上的 "Tombstone upon deactivation while debugging",运行 debugger下的app,在app运行ning时按Windows键,切换回app