为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)在启动应用程序或后台任务(与锁定屏幕共享)时,实时磁贴继续更新而不会出现任何问题。
任何想法在这里发生了什么,以及我可以做些什么来解决这个问题?
答案 0 :(得分:0)
是否可以提供代码片段,以便从隔离存储中获取图像并将其更新为锁定屏幕
当两个线程试图访问同一个独立存储时,通常会抛出此异常。仅当它未附加到调试器(在您的情况下)时才会发生这种情况。找到它很棘手。我认为在删除图像的同时,图像也会被保存。
答案 1 :(得分:0)
documentation建议只在两个文件名之间交替使用:
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);
}
}
}