C# 尝试将映像写入WP7 Mango中的独立存储时出错

C# 尝试将映像写入WP7 Mango中的独立存储时出错,c#,windows-phone-7,C#,Windows Phone 7,这里我附上代码片段 错误为:访问IsolatedStorage时出错。 public Boolean SaveImage(string filename, WriteableBitmap wrtbmp) { try { using (IsolatedStorageFile iSF = IsolatedStorageFile.GetUserStoreForApplication()) { if (iSF.FileExists(

这里我附上代码片段

错误为:
访问IsolatedStorage时出错。

public Boolean SaveImage(string filename, WriteableBitmap wrtbmp)
{
    try
    {
        using (IsolatedStorageFile iSF = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (iSF.FileExists(filename))
            {
                iSF.DeleteFile(filename);
            }
            using (IsolatedStorageFileStream fstream = new IsolatedStorageFileStream(filename, FileMode.CreateNew, FileAccess.Write, iSF))
            {
                wrtbmp.SaveJpeg(fstream, wrtbmp.PixelWidth, wrtbmp.PixelHeight, 0, 100);
                fstream.Close();
                fstream.Dispose();
            }
        }
    }
    catch (Exception ex)
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            System.Diagnostics.Debugger.Break();
        }
        return false;
    }

    return true;
}

这是我用来保存图像的方法,当它到达删除文件的部分(如果文件已经存在)时执行,它会抛出错误,但在某些情况下,它执行得非常完美,没有错误。

首先,没有理由调用
fstream.Close()
fstream.Dispose()
当您使用
using
语句时,该语句会自动关闭并处理流

其次,你的错误不够明确

堆栈跟踪指向。您确定要删除的路径有效吗?您确定该文件存在吗?我不记得很清楚,但我认为如果找不到文件,删除文件可能会抛出-请检查链接MSDN方法描述中的示例-它们有一个if存在。 [编辑:对不起,我今天有点累了,我没有正确地阅读您的代码。很明显,您的代码已经防止了文件不存在。]

除了可能不存在的问题外,还有一个很小的可能性,在这里,但在代码的其他地方,有一些东西打开了文件,但没有正确地关闭它。在这种情况下,系统会认为该文件正在使用中(即使在别处打开的“旧”句柄被“遗忘”并等待GC’ed),并且除非该句柄实际死亡,否则对该文件的任何操作都不会成功

另一件事是,即使使用/autodispose,如果尝试从不同线程一次多次调用该方法,操作仍然可能失败。对于异步模式,有时可能很难注意到-从调用此方法的代码点彻底检查,并考虑是否会发生这种情况,即GUI回调将同时调用它,可能还会调用一些后台操作?如果是这样,请尝试用lock语句另外包装using语句。如果这有帮助,那就意味着你有重入问题


编辑:有人,在遥远的将来的某个时候,会因为我的百分百的编辑而杀了我。。但我还是要写:):我认为一般来说,在写之前不必删除文件。CreateFile不是唯一可以访问这些文件的人。使用mode=OpenOrCreate | Truncate或更短的选项进行检查:mode=Create(有关说明,请参见标志)

1。我试着接近并处理一个疯狂的修复。。。如果这不在流程中,它也会抛出相同的错误。您需要给我们一个stacktrace,否则我们无法帮助您。在FakePhoneCall.Viewmodel.AddProfileViewModel.SaveImage(字符串文件)中找到System.IO.IsolatedStorage.IsolatedStorage.IsolatedStorage.DeleteFile(字符串文件),在FakePhoneCall.Viewmodel.AddProfileViewModel中找到SaveImage(字符串文件名,WriteableBitmap wrtbmp),在FakePhoneCall.Viewmodel.AddProfileViewModel中找到SaveProfile()rakesh-编辑您的帖子并将stacktrace粘贴到那里,并附上适当的描述,而不是作为评论发布。这将是更可读性我试图通过删除iSF.DeleteFile(文件名)相同的代码;语句,但此时它抛出错误“不允许对IsolatedStorageFileStream执行操作”。您是否已将CreateNew更改为Create或OpenOrCreate | Trunc?如果是这样,则可能该文件已在其他地方使用,并且在关闭另一个实例之前无法重新打开。我建议在每次使用应用程序中的isolatedstoragefile之前添加调试日志,如:(“使用文件:{0}”,filename),在使用应用程序中的isolatedstoragefile之后添加(“关闭的文件:{0}”,filename),然后检查日志/输出,查看哪些/何时/何地忘记关闭该文件。另一种可能性很少见(千分之一?),但也有可能——你的应用程序的一个旧实例仍在后台运行。如果是这样,请重新启动设备,然后重试。