Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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# asp.net中静态变量的读/写锁定_C#_Asp.net_Multithreading - Fatal编程技术网

C# asp.net中静态变量的读/写锁定

C# asp.net中静态变量的读/写锁定,c#,asp.net,multithreading,C#,Asp.net,Multithreading,我的C#ASP.NET项目中有一个静态变量(抽象数据类型,而不是原语) 它将被多个线程同时频繁地读取 我很少需要写它(与读的次数相比) 确保线程安全的最佳方法是什么,以便在我向其写入数据时,其他线程不会读取部分写入的数据 我只使用过锁,但我知道这会阻止并发读取:( 谢谢您可以使用读写器锁,它比锁更难使用,但它允许并发读取: 我从锁开始。无竞争的锁非常便宜。你可以使用(假设你使用的是.NET 3.5),但锁更容易找到正确的锁。如果出现问题,请对其进行优化 StraightReaderWriterL

我的C#ASP.NET项目中有一个静态变量(抽象数据类型,而不是原语)

它将被多个线程同时频繁地读取

我很少需要写它(与读的次数相比)

确保线程安全的最佳方法是什么,以便在我向其写入数据时,其他线程不会读取部分写入的数据

我只使用过
,但我知道这会阻止并发读取:(


谢谢

您可以使用
读写器锁
,它比
更难使用,但它允许并发读取:

我从
锁开始。无竞争的锁非常便宜。你可以使用(假设你使用的是.NET 3.5),但锁更容易找到正确的锁。如果出现问题,请对其进行优化

Straight
ReaderWriterLock
可能比简单锁慢-它没有可能快,因此是slim版本:)

你说的“频繁”是指多久一次?你预计会有多少竞争?您可能希望对其进行建模(例如,模拟合理数量的请求)并对无锁定与简单锁定进行基准测试,以了解开销是多少

您可能可以使用无锁选项
volatile
——但坦率地说,我最近放弃了这一点,因为理智的人很难推理。(这不是我想的意思。)


你到底在用这些数据做什么?该类型是不可变的类型吗?因此,一旦获得了正确的引用,就可以以线程安全的方式读取,而无需任何锁定?

感谢您的帮助,我已经确定了这种方法,直到性能成为一个问题。假设这是正确的(线程安全),其中SharedResource是不可变的

public static class SharedResourceManager
{
    private static readonly object syncLock = new object();

    private static SharedResource res { get; set; }

    public static SharedResource Resource
    {
        get
        {
            lock (syncLock)
                return res;
        }
        set
        {
            lock(syncLock)
                res = value;
        }
    }
}

好的建议-这是.NET framework中的一个奇怪之处,除非你读到它,否则你可能会做出错误的选择。@Andrew-如果你想了解更多,这里有一篇好文章-谢谢你的建议。每一个请求我都会阅读,所以只要有流量,我就会经常阅读。我想我忽略了不变性这一点。目前它不是(但可能是),所以锁定并不能真正帮助我。嗯,是时候重新考虑了。如果我把它设置为不可变的,也许我就不需要任何锁定,因为请求只需要一段时间copy@Andrew:您仍然需要锁定或使其不稳定,以避免获取过时数据。是的,这是安全的。使用易失性私有变量可能也可以。如果某个属性是私有的,那么您使用该属性作为
res
的原因是什么?