C# System.UnauthorizedAccessException:访问被拒绝。使用文件时使用Windows Phone

C# System.UnauthorizedAccessException:访问被拒绝。使用文件时使用Windows Phone,c#,windows-phone-8,serialization,async-await,isolatedstoragefile,C#,Windows Phone 8,Serialization,Async Await,Isolatedstoragefile,当我试图在Windows Phone上保存列表时,收到一条“System.UnauthorizedAccessException:访问被拒绝”消息 情景: 单击favorite按钮时,系统将检查该项目是否已经是收藏夹 下一步是调用Load方法。这将返回包含收藏夹的列表 当项目是收藏夹时,我将从列表中删除它,否则我将添加它 最后一步是用我的save方法保存新列表 执行此代码时,我得到以下异常: System.UnauthorizedAccessException:访问被拒绝。(来自HRESULT的

当我试图在Windows Phone上保存列表时,收到一条“System.UnauthorizedAccessException:访问被拒绝”消息

情景:

单击favorite按钮时,系统将检查该项目是否已经是收藏夹

下一步是调用Load方法。这将返回包含收藏夹的列表

当项目是收藏夹时,我将从列表中删除它,否则我将添加它

最后一步是用我的save方法保存新列表

执行此代码时,我得到以下异常:

System.UnauthorizedAccessException:访问被拒绝。(来自HRESULT的异常:0x80070005(E_访问被拒绝)

我环顾四周,发现可能是清单功能。所以我检查了所有这些功能,只是为了确定。再试一次后,我仍然得到异常

我必须做什么?代码如下:

     private async void favoriteClicked(object sender, EventArgs e)
    {
        if (_progressIndicator.IsVisible == false)
        {
            try
            {
                Boolean isFavorite = Settings.GetValueOrDefault<Boolean>(currentArtist.id, false);
                ArtistSaving favorite = new ArtistSaving(currentArtist.id, currentArtist.name, currentArtist.shortBio);
                artistList = await Task.Run(() => Utils.Load<ArtistSaving>());
                if (isFavorite == true)
                {
                    artistList.Remove(favorite);
                    displayDeletePopup();
                    Settings.AddOrUpdateValue(currentArtist.id, false);
                    await Task.Run(() => Utils.Save<ArtistSaving>(artistList));
                }
                else
                {
                    artistList.Add(favorite);
                    displayXamlPopup();
                    Settings.AddOrUpdateValue(currentArtist.id, true);
                     await Task.Run(() =>  Utils.Save<ArtistSaving>(artistList));
                }
            }
            catch (ArgumentException ex)
            {

            }
        }
    }
private async void favoriteClicked(对象发送方,事件参数e)
{
如果(_progressIndicator.IsVisible==false)
{
尝试
{
布尔值isFavorite=Settings.GetValueOrDefault(currentArtister.id,false);
ArtistSaving favorite=新的ArtistSaving(currentArtist.id、currentArtist.name、currentArtist.shortBio);
artistList=wait Task.Run(()=>Utils.Load());
如果(isFavorite==true)
{
艺术家。移除(收藏);
displayDeletePopup();
Settings.AddOrUpdateValue(currentArtister.id,false);
wait Task.Run(()=>Utils.Save(artistList));
}
其他的
{
artistList.Add(收藏夹);
displayXamlPopup();
Settings.AddOrUpdateValue(currentArtister.id,true);
wait Task.Run(()=>Utils.Save(artistList));
}
}
捕获(参数异常)
{
}
}
}
收藏夹按钮单击

public static async Task<ObservableCollection<T>> Load<T>()
    {
        // Create a new folder name DataFolder.
        var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(JSONFILENAME,
        CreationCollisionOption.OpenIfExists);

        var jsonSerializer = new DataContractJsonSerializer(typeof(ObservableCollection<T>));

        var myStream = await file.OpenStreamForReadAsync();

        ObservableCollection<T> myObj = (ObservableCollection<T>)jsonSerializer.ReadObject(myStream);

        if (myObj == null)
        {
            return new ObservableCollection<T>();
        }
        return myObj;
    }
公共静态异步任务加载()
{
//创建一个新文件夹名DataFolder。
var file=wait Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(JSONFILENAME,
CreationCollisionOption.OpenIfExists);
var jsonSerializer=新的数据契约jsonSerializer(typeof(ObservableCollection));
var myStream=await file.OpenStreamForReadAsync();
ObservableCollection myObj=(ObservableCollection)jsonSerializer.ReadObject(myStream);
if(myObj==null)
{
返回新的ObservableCollection();
}
返回myObj;
}
这是加载方法

 public static async void Save<T>(ObservableCollection<T> obj)
    {
        var serializer = new DataContractJsonSerializer(typeof(ObservableCollection<T>));

        using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(
            JSONFILENAME, CreationCollisionOption.ReplaceExisting))
        {
            serializer.WriteObject(stream, obj);
        }
    }
公共静态异步无效保存(ObservableCollection obj)
{
var serializer=newdatacontractjsonserializer(typeof(ObservableCollection));
使用(var stream=wait ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync)(
JSONFILENAME,CreationCollisionOption.ReplaceExisting)
{
serializer.WriteObject(stream,obj);
}
}
这就是保存方法

编辑--解决方案

public static async Task<ObservableCollection<T>> Load<T>()
    {
        ObservableCollection<T> myObj = null;
        // Create a new folder name DataFolder.
        var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(JSONFILENAME,
        CreationCollisionOption.OpenIfExists);

        var jsonSerializer = new DataContractJsonSerializer(typeof(ObservableCollection<T>));

        using (var myStream = await file.OpenStreamForReadAsync())
        {
            myObj = (ObservableCollection<T>)jsonSerializer.ReadObject(myStream);
            if (myObj == null)
            {
                return new ObservableCollection<T>();
            }
            return myObj;
        }


    }
公共静态异步任务加载()
{
ObservableCollection myObj=null;
//创建一个新文件夹名DataFolder。
var file=wait Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(JSONFILENAME,
CreationCollisionOption.OpenIfExists);
var jsonSerializer=新的数据契约jsonSerializer(typeof(ObservableCollection));
使用(var myStream=await file.OpenStreamForReadAsync())
{
myObj=(ObservableCollection)jsonSerializer.ReadObject(myStream);
if(myObj==null)
{
返回新的ObservableCollection();
}
返回myObj;
}
}

读取文件时,文件很可能仍处于锁定状态。请修改加载方法以释放文件锁定:

using (var myStream = await file.OpenStreamForReadAsync())
{
    ObservableCollection<T> myObj = (ObservableCollection<T>)jsonSerializer.ReadObject(myStream);
}
使用(var myStream=await file.OpenStreamForReadAsync())
{
ObservableCollection myObj=(ObservableCollection)jsonSerializer.ReadObject(myStream);
}

读取文件时,文件很可能仍处于锁定状态。请修改加载方法以释放文件锁定:

using (var myStream = await file.OpenStreamForReadAsync())
{
    ObservableCollection<T> myObj = (ObservableCollection<T>)jsonSerializer.ReadObject(myStream);
}
使用(var myStream=await file.OpenStreamForReadAsync())
{
ObservableCollection myObj=(ObservableCollection)jsonSerializer.ReadObject(myStream);
}

没有必要使用“isFavorite==true”。isFavorite已经是一个布尔值,所以你可以使用if(isFavorite)。这是真的,谢谢;)没有必要使用“isFavorite==true”。isFavorite已经是一个布尔值,所以你可以使用if(isFavorite)。这是真的,谢谢;)你是个天才!这就成功了!用解决方案更新了我的问题。非常感谢,你能解释一下为什么这个“使用”是正确的吗?当然!流类继承自IDisposable。这意味着一旦构建了对象,它就会一直挂起,直到调用Dispose()方法为止。using方法将自动调用Dispose()方法,这将导致对象超出范围并释放资源。关于一次性物品存在的原因,我有一个很好的概述。没问题,我去年已经讨论了所有这些问题:)先生,你是个天才!这就成功了!用解决方案更新了我的问题。非常感谢,你能解释一下为什么这个“使用”是正确的吗?当然!流类继承自IDisposable。这意味着一旦构建了对象,它就会一直挂起,直到调用Dispose()方法为止。using方法将自动调用Dispose()方法,这将导致对象超出范围并释放资源。关于一次性物品存在的原因,我有一个很好的提纲。没问题,我去年已经讨论了所有这些问题:)