Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
C# 如何防止应用程序在WinRT中使用文件_C#_Multithreading_Windows Runtime_Winrt Async - Fatal编程技术网

C# 如何防止应用程序在WinRT中使用文件

C# 如何防止应用程序在WinRT中使用文件,c#,multithreading,windows-runtime,winrt-async,C#,Multithreading,Windows Runtime,Winrt Async,我有一个有几个线程的应用程序。第一个线程写入存储文件,第二个线程读取相同的存储文件。问题是,当第一个线程写入该文件时,我无法阻止第二个线程读取该文件。这里是否有类似于使用关键字的内容,我可以使用它来获得对文件的单一访问权限 在StackOverflow上也有类似的问题,但它不适合我的解决方案 我的代码: public async static Task<bool> Save(string filename, object o) { try

我有一个有几个线程的应用程序。第一个线程写入
存储文件
,第二个线程读取相同的
存储文件
。问题是,当第一个线程写入该文件时,我无法阻止第二个线程读取该文件。这里是否有类似于
使用
关键字的内容,我可以使用它来获得对文件的单一访问权限

在StackOverflow上也有类似的问题,但它不适合我的解决方案

我的代码:

    public async static Task<bool> Save(string filename, object o)
    {
        try
        {
            Stream stream;

            var folder = Windows.Storage.ApplicationData.Current.LocalFolder;
            var file = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
            stream = await file.OpenStreamForWriteAsync();
            if (o == null || stream == null)
            { }
            else
            {
                DataContractSerializer ser = new DataContractSerializer(o.GetType());
                ser.WriteObject(stream, o);
            }


            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
公共异步静态任务保存(字符串文件名,对象o)
{
尝试
{
溪流;
var folder=Windows.Storage.ApplicationData.Current.LocalFolder;
var file=await folder.CreateFileAsync(文件名,CreationCollisionOption.ReplaceExisting);
stream=wait file.OpenStreamForWriteAsync();
if(o==null | | stream==null)
{ }
其他的
{
DataContractSerializer ser=新的DataContractSerializer(o.GetType());
ser.WriteObject(流,o);
}
返回true;
}
捕获(例外e)
{
返回false;
}
}

我最终解决了这个问题,在内存中的数据上添加了锁,而不是在文件上添加锁,这虽然很优雅,但很耗时。然而,在对斯利拉玛·萨基维尔的暗示做出反应的过程中,我发现这是一个非常有用的话题。我希望这会对某些人有所帮助。

您正在寻找某种同步机制吗?当第一个线程仍在写入文件时,您希望第二个线程做什么?是的,这是正确的术语。同步机构。第二个线程应该等到编写完成并且文件“可以自由操作”之后。使用锁或waithandle,以适合您的要求为准。您应该回答自己的问题,然后将问题标记为已回答。