如何处理并发性StorageFile操作?(How to handle concurrency wi

2019-10-17 06:46发布

我试图写一个文件,但“偶尔”我碰上,我认为是到并发问题,因为有些时候,我得到一个System.UnauthorizedAccessException与消息:

访问被拒绝。 (从HRESULT异常:0X80070005(E_ACCESSDENIED))

......从以下几点:

public async void SubmitChanges()
{
    DataContractSerializer serializer = 
        new DataContractSerializer(typeof(LocalCache<T>));

    StorageFile file = await ApplicationData.Current.LocalFolder
            .CreateFileAsync(GetFileNameForType(), 
                CreationCollisionOption.ReplaceExisting);

    //Occasionally throws here
    using (var fi = await file.OpenTransactedWriteAsync())
    {
        serializer.WriteObject(fi.Stream.AsStreamForWrite(), this);
        await fi.CommitAsync();
    }
}

我只能认为这是到一些并发性,或者是仍然开放读别的地方,但我似乎无法找到一个方法来等待它变得可用-我通常lock在其周围,但这不与允许await因此什么其他选择?

Answer 1:

通常情况下,你只是不,直到前面的操作完成后开始的下一个操作。

提示:避免async void ; 使用async Task来代替。 这可让您知道什么时候以前的操作完成。



Answer 2:

有一些事情会在这里发生。 斯蒂芬上面提到的,你的封装方法不返回的任务。 这意味着,不论用何种方法调用的SubmitChanges与称之为“射后不理”遵循此调用可以并行运行模式和代码。 这可能不是你想要的。

此外,我注意到你正在使用StorageFile.OpenTransacted。 我没有使用过这一点,但注解指出OpenTransacted仅支持在支持的操作系统ReplaceFile 。 此功能允许字面上的新文件承担旧文件的身份,但我敢肯定,操作将失败,如果旧的文件被打开。

我不认为尝试交换文件的身份会发生,直到成交的文件被关闭,这将发生在处置 ,这是由于使用的语句,也就是你看到的,有时异常的行会自动发生。

我建议你返回一个任务,而不是和我也会考虑使用常规StorageFile.OpenAsync。



文章来源: How to handle concurrency with StorageFile operations?