0

在为 Windows Phone 8.0 silverlight 应用程序生成锁屏图像时,我使用以下代码:

fileName = Guid.NewGuid() + ".jpg";

using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
{                            
    using (var isostream = iso.CreateFile(fileName))
    {
        Extensions.SaveJpeg(bmp, isostream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);
        isostream.Close();
    }
}

当我运行应用程序或通过后台任务(假设锁定屏幕设置已打开)时,这绝对可以正常工作。

我最近添加了在启动应用程序时运行的代码,以删除以前的锁屏图像以提高存储效率。

这是 App.xaml.cs 中使用的代码:

using (var iso = IsolatedStorageFile.GetUserStoreForApplication() )
{
    foreach (string file in GetAllFiles("*.jpg", iso))
    {
        iso.DeleteFile(file);
    }

    iso.Dispose();
}

GetAllFiles 方法复制自:http: //msdn.microsoft.com/en-us/library/zd5e2z84%28v=vs.110%29.aspx

调试时可以正常工作;自上次启动应用程序以来创建的所有锁屏图像都将被成功删除。需要明确的是,应用程序存储的唯一 jpg 是锁屏图像。

但是,问题是每当我确实包含此删除操作时,锁定屏幕图像从那一刻起停止更新。每当尝试更新它时,我都会收到此异常:

System.IO.IsolatedStorage.IsolatedStorageException:IsolatedStorageFileStream 上不允许操作。在 System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(字符串路径,FileMode 模式,FileAccess 访问,FileShare 共享,Int32 bufferSize,IsolatedStorageFile isf)在 System.IO.IsolatedStorage.IsolatedStorageFile.OpenFile(字符串路径,FileMode 模式)...

要记住几件事:

1) 每当应用程序启动时,删除操作首先在 App.xaml.cs 中运行,而锁定屏幕图像稍后由视图模型更新(这是针对天气应用程序,因此新的锁定屏幕图像返回天气后创建)。

2) 删除操作仅在应用主动打开且锁屏设置开启时执行;在后台任务中根本不会调用它。

奇怪的是,当我重新安装应用程序时,默认情况下锁屏设置是关闭的。当我打开锁定屏幕时,锁定屏幕图像已成功创建。如果我关闭应用程序并且从不重新启动它(因此从不调用删除操作代码),则锁定屏幕图像永远不会更新,因为后台任务会遇到相同的先前引用的异常。

如果我按照完全相同的步骤但在 App.xaml.cs 中没有删除操作代码,则锁屏图像每次都会成功更新。

3)动态磁贴继续更新,没有任何问题,无论是在应用程序启动时还是在后台任务中(它与锁定屏幕共享)。

任何想法这里发生了什么,我能做些什么来解决这个问题?

4

2 回答 2

0

您能否提供从隔离存储中获取图像并将其更新为锁定屏幕的代码片段

通常当两个线程试图访问同一个隔离存储时会引发此异常。仅当它未附加到调试器(在您的情况下)时才会发生这种情况。很难找到。我认为在删除图像的同时,图像也会被保存。

于 2015-01-05T13:22:42.613 回答
0

文档建议在两个文件名之间交替,如下所示:

string fileName;
var currentImage = LockScreen.GetImageUri();

if (currentImage.ToString().EndsWith("_A.jpg"))
{
    fileName = "LiveLockBackground_B.jpg";
}
else
{
    fileName = "LiveLockBackground_A.jpg";
}
var lockImage = string.Format("{0}", fileName);

我在我的一个应用程序中使用这种方法没有问题。

如果您希望继续使用随机 Guid,则应在尝试删除之前检查文件名是否与当前锁屏不同。

var currentImage = LockScreen.GetImageUri();
using (var iso = IsolatedStorageFile.GetUserStoreForApplication() )
{
    foreach (string file in GetAllFiles("*.jpg", iso))
    {
        if(AreFilesTheSame(currentImage, file) == false)
        {
            iso.DeleteFile(file);
        }
    }
}
于 2015-01-05T18:24:37.290 回答