小编use*_*539的帖子

WCF PerCall共享资源锁定问题

我正在写一个不断来自不同来源的服务.服务需要在对单个共享资源的某些调用期间保留数据.在这种情况下,一个XML文件(我知道这是存储数据的愚蠢选择,但我无法控制该决定).

所以我希望服务能够运行

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
Run Code Online (Sandbox Code Playgroud)

除了这种情况,我不需要会话,并且我的对象构造函数中的设置代码非常少.但是,静态变量不会在每次调用服务之间共享(它们会快速而激烈地进行).因此,文件上的静态锁定不起作用.我经过惨痛的教训才学到这个:

private string _dataFile;

private static object _lock = new object();

private MusicData Get(string fileName)
{
    lock (_lock)
    {
        using (var stream = File.OpenRead(fileName))
        {
            var serializer = new XmlSerializer(typeof(MusicData));
            return serializer.Deserialize(stream) as MusicData;
        }
    }
}

private void Put(string fileName, MusicData data)
{
    lock (_lock)
    {
        XmlSerializer x = new XmlSerializer(typeof(MusicData));
        using (TextWriter writer = new StreamWriter(fileName))
        {
            x.Serialize(writer, data);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个地方最好的策略是什么?我不想将我InstanceContextMode改为PerSession仅仅为此而且任何类型的数据库解决方案都是不可能的.上面的代码导致了可怕的错误:

该进程无法访问该文件,因为该文件正由另一个进程使用

c# wcf multithreading synchronization locking

9
推荐指数
1
解决办法
961
查看次数

标签 统计

c# ×1

locking ×1

multithreading ×1

synchronization ×1

wcf ×1