Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 从IsolatedStorageFile删除文件会导致;IsolatedStorageException:不允许操作;当锁屏图像要更新时_Silverlight_Windows Phone 8_Isolatedstorage_Lockscreen_Isolatedstoragefile - Fatal编程技术网

Silverlight 从IsolatedStorageFile删除文件会导致;IsolatedStorageException:不允许操作;当锁屏图像要更新时

Silverlight 从IsolatedStorageFile删除文件会导致;IsolatedStorageException:不允许操作;当锁屏图像要更新时,silverlight,windows-phone-8,isolatedstorage,lockscreen,isolatedstoragefile,Silverlight,Windows Phone 8,Isolatedstorage,Lockscreen,Isolatedstoragefile,为Windows Phone 8.0 silverlight应用程序生成锁屏图像时,我使用以下代码: fileName = Guid.NewGuid() + ".jpg"; using (var iso = IsolatedStorageFile.GetUserStoreForApplication()) { using (var isostream = iso.CreateFile(fileName)) {

为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方法是从以下位置复制的:

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

然而,问题是每当我包含这个删除操作时,锁屏图像就会从那一刻起停止更新。无论何时尝试更新,我都会收到此异常:

System.IO.IsolatedStorage.IsolatedStorageException:不允许对IsolatedStorageFileStream执行操作。 位于System.IO.IsolatedStorage.IsolatedStorage FileStream..ctor(字符串路径、文件模式、文件访问访问、文件共享、Int32 bufferSize、IsolatedStorage文件isf) 在System.IO.IsolatedStorage.IsolatedStorageFile.OpenFile(字符串路径,文件模式)

需要记住的几件事:

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

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

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

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

3) 无论是在应用程序启动时还是在后台任务(与锁屏共享)中,live互动程序都会继续更新,不会出现任何问题


你知道这里发生了什么,我能做些什么来解决这个问题吗?

你能提供从独立存储中获取图像并将其更新到锁屏的代码片段吗

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

建议在两个文件名之间交替使用,例如:

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);
        }
    }
}

在更新锁屏图像时,我实际上并没有从隔离存储中获取图像,而是创建一个新的可写位图来呈现用户控件。我确实包含了显示如何保存新锁屏图像的代码。你说的有道理,但要记住2)。即使我从未运行过删除代码(即,我从未在打开锁屏后重新启动应用程序-此代码仅在启动应用程序且锁屏打开时运行,而在打开锁屏时不运行),也会出现此问题。后台任务不会删除任何图像。顺便问一下,在连续两次图像更新之间,您保持了多少时间间隔?图像保存代码在后台任务中?它会更新每个后台任务,或者在您启动应用程序时更新。只有一个图像。如果您已经几个小时没有打开应用程序,则需要删除在此期间创建的每个锁屏图像(每小时3个x小时数)。是的,在后台任务之外使用的图像保存代码也在其中使用。就像我说的,只要我不使用这个删除操作,就可以完全正常工作。还有一件事…你是否在手机上等待了整整30分钟,以释放模式执行后台任务?好吧,看来问题是我在删除代码中删除了一个我不应该删除的特定图像(用于锁定屏幕的背景图像)。但我仍然不明白的是,当我在存在删除代码但从未运行过的情况下进行测试时,会发生什么情况。谢谢你的时间,Rahul。你的话确实让我想到了这个潜在的场景!