c# – LockurrentDictionary的值

分区是我创建的一个小类.我有数千个分区驻留在名为Partitions的ConcurrentDictionary中.在序列化之前,我想锁定一个特定的分区,做一些工作,然后解锁分区.

在此期间,没有其他线程应该能够访问该分区.由于我的类Partition是一个引用类型,我想知道我是否可以锁定单个Partition对象,就像我在下面的代码中一样?

这会在下面的锁定期间阻止来自ConcurrentDictionary分区中的单个分区的其他线程吗?

我不想使用类级锁定器对象进行锁定.我的思维过程是多个线程应该能够同时运行下面的代码.他们只是应该无法访问特定的分区,如果它被锁定…

private void serializePartition(int partNo)
    {
        Partition p;

        //Get a reference to the partition, lock, and save it to disk.
        lock (p = Partitions[partNo])
        {
            using (var file = File.Create(dataPath + tableName + partNo + ".ppmi"))
            {
                Serializer.Serialize(file, p);
            }

            //decrement _CurrentRecordsInMemory by the size of the partition.
            Interlocked.Add(ref _CurrentRecordsInMemory, p.Data.Count * -1);

            //Clear the partitions data to free up memory and reset partition variables
            p.Data = null;
            p.OnDisk = true;
            p.StartCount = 0;
        }
    }

最佳答案 您当前的实现只会在功能代码中阻止该位置的Partition对象.只要线程没有再次执行serializePartition(),另一个线程仍然可以访问该Partition对象.看到你使用的是ConcurrentDictionary,它是Thread安全的,所以应该没有问题.

点赞