在 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
没有被调用,不是我调用 Load
而 OnImageLoaded
从来没有发生过。
s_Pixels 任何地方都没有其他作业。
我会检查图像加载错误。有一个 ImageFailed
事件处理程序会留下日志跟踪。它从未被调用,为什么会被调用 - 有问题的图像在应用程序的资源中。
这怎么可能? Windows Phone 应用程序如何在不调用 Launching 的情况下初始化和加载?
Application_Launching
仅在您的应用程序重新启动时调用。如果你将它发送到后台,而系统最终将其逻辑删除,然后用户重新激活它,你的静态数据将消失,但 不会 被调用。相反,您会接到 Application_Activated
.
的电话
所以,基本上,您需要 运行 在 Launching
和 Activated
方法上进行所有静态初始化。
您很可能会通过使用 Visual Studio 强制应用程序的逻辑删除来重现用户遇到的问题:检查项目选项的“调试”选项卡上的 "Tombstone upon deactivation while debugging",运行 debugger下的app,在app运行ning时按Windows键,切换回app
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
没有被调用,不是我调用 Load
而 OnImageLoaded
从来没有发生过。
s_Pixels 任何地方都没有其他作业。
我会检查图像加载错误。有一个 ImageFailed
事件处理程序会留下日志跟踪。它从未被调用,为什么会被调用 - 有问题的图像在应用程序的资源中。
这怎么可能? Windows Phone 应用程序如何在不调用 Launching 的情况下初始化和加载?
Application_Launching
仅在您的应用程序重新启动时调用。如果你将它发送到后台,而系统最终将其逻辑删除,然后用户重新激活它,你的静态数据将消失,但 不会 被调用。相反,您会接到 Application_Activated
.
所以,基本上,您需要 运行 在 Launching
和 Activated
方法上进行所有静态初始化。
您很可能会通过使用 Visual Studio 强制应用程序的逻辑删除来重现用户遇到的问题:检查项目选项的“调试”选项卡上的 "Tombstone upon deactivation while debugging",运行 debugger下的app,在app运行ning时按Windows键,切换回app