C# 字典中对象的同步

C# 字典中对象的同步,c#,multithreading,dictionary,sync,C#,Multithreading,Dictionary,Sync,我在C#中维护了一个字典,它有一个到类对象映射的字符串 public class parent { public Dictionary<string, valueclass> clientToFileSystemMap {get;set;} } class valueclass { //some internal state valueclass createclone() { create clone of t

我在C#中维护了一个字典,它有一个到类对象映射的字符串

public class parent
{          
    public Dictionary<string, valueclass> clientToFileSystemMap {get;set;}
}

class valueclass
{
    //some internal state

    valueclass createclone()
    {
        create clone of this object and return
    }

    void update()
    {
        change state 
    }
}
公共类父类
{          
公共字典clientToFileSystemMap{get;set;}
}
类值类
{
//某些内部状态
valueclass createclone()
{
创建此对象的克隆并返回
}
无效更新()
{
改变状态
}
}
现在可以有同时更新和克隆同一对象的线程。我希望同步访问,以便克隆不会返回半更新的对象

我发现的一种方法是在valueclass类中创建一个私有锁对象,并在该操作之前获取该锁。另一个选项是使用这里提到的
[MethodImpl(methodimpoptions.Synchronized)]
。 另一种选择是创建一个类似于类对象的对象字典,并锁定它们

最好的方法是什么?

您可以使用来控制对字典元素的访问-但是如果听起来每个对象都需要一个私有锁-就像线程有引用一样-字典不是真正的问题

private object privateLock = new object();

void update(){
    lock(privateLock)
    {
        //change state 
    }
}

valueclass createclone(){
    lock(privateLock)
    {
        //Clone 
    }
}
您可以使用来控制对dictionary元素的访问—但是如果听起来像是每个对象都需要一个私有锁—就像线程有一个引用—dictionary并不是真正的问题

private object privateLock = new object();

void update(){
    lock(privateLock)
    {
        //change state 
    }
}

valueclass createclone(){
    lock(privateLock)
    {
        //Clone 
    }
}
您可以使用来控制对dictionary元素的访问—但是如果听起来像是每个对象都需要一个私有锁—就像线程有一个引用—dictionary并不是真正的问题

private object privateLock = new object();

void update(){
    lock(privateLock)
    {
        //change state 
    }
}

valueclass createclone(){
    lock(privateLock)
    {
        //Clone 
    }
}
您可以使用来控制对dictionary元素的访问—但是如果听起来像是每个对象都需要一个私有锁—就像线程有一个引用—dictionary并不是真正的问题

private object privateLock = new object();

void update(){
    lock(privateLock)
    {
        //change state 
    }
}

valueclass createclone(){
    lock(privateLock)
    {
        //Clone 
    }
}

您还可以使用ICollection接口提供的SyncRoot


您还可以使用ICollection接口提供的SyncRoot


您还可以使用ICollection接口提供的SyncRoot


您还可以使用ICollection接口提供的SyncRoot



你能发布一个更具体的代码(在你粘贴的代码中,没有你提到的字典)以获得更好的答案吗?完成。虽然字典在这里并不重要。你能发布一个更具体的代码(在你粘贴的代码中,没有你提到的字典)来获得更好的答案吗?完成。虽然字典在这里并不重要。你能发布一个更具体的代码(在你粘贴的代码中,没有你提到的字典)来获得更好的答案吗?完成。虽然字典在这里并不重要。你能发布一个更具体的代码(在你粘贴的代码中,没有你提到的字典)来获得更好的答案吗?完成。虽然字典在这里并不重要,谢谢。是的,这似乎是正确的选择。顺便问一下,为什么这种方法比使用[MethodImpl(MethodImplOptions.Synchronized)]更受欢迎,有什么具体原因吗?好吧,你实际上需要使用相同的锁,而不是不同的方法,所以,我建议锁定一个对象。[MethodImpl(MethodImplOptions.Synchronized)]是否要锁定此对象?@piyush Synchronized标志告诉编译器确保一次只有一个线程在函数中。它不会阻止两个踏板在更新中的克隆秒内同时启动。听起来您需要确保同步在这两个函数之间进行。据我所知,[MethodImpl(MethodImplOptions.Synchronized)]将锁定这两个函数。如果我将[MethodImpl(MethodImplOptions.Synchronized)]添加到这两个方法中,那么对它们的访问将变得同步,对吗?谢谢。是的,这似乎是正确的选择。顺便问一下,为什么这种方法比使用[MethodImpl(MethodImplOptions.Synchronized)]更受欢迎,有什么具体原因吗?好吧,你实际上需要使用相同的锁,而不是不同的方法,所以,我建议锁定一个对象。[MethodImpl(MethodImplOptions.Synchronized)]是否要锁定此对象?@piyush Synchronized标志告诉编译器确保一次只有一个线程在函数中。它不会阻止两个踏板在更新中的克隆秒内同时启动。听起来您需要确保同步在这两个函数之间进行。据我所知,[MethodImpl(MethodImplOptions.Synchronized)]将锁定这两个函数。如果我将[MethodImpl(MethodImplOptions.Synchronized)]添加到这两个方法中,那么对它们的访问将变得同步,对吗?谢谢。是的,这似乎是正确的选择。顺便问一下,为什么这种方法比使用[MethodImpl(MethodImplOptions.Synchronized)]更受欢迎,有什么具体原因吗?好吧,你实际上需要使用相同的锁,而不是不同的方法,所以,我建议锁定一个对象。[MethodImpl(MethodImplOptions.Synchronized)]是否要锁定此对象?@piyush Synchronized标志告诉编译器确保一次只有一个线程在函数中。它不会阻止两个踏板在更新中的克隆秒内同时启动。听起来您需要确保同步在这两个函数之间进行。据我所知,[MethodImpl(MethodImplOptions.Synchronized)]将锁定这两个函数。如果我将[MethodImpl(MethodImplOptions.Synchronized)]添加到这两个方法中,那么对它们的访问将变得同步,对吗?谢谢。是的,这似乎是正确的选择。顺便问一下,为什么这种方法比使用[MethodImpl(MethodImplOptions.Synchronized)]更受欢迎,有什么具体原因吗?好吧,你实际上需要使用相同的锁,而不是不同的方法,所以,我建议锁定一个对象。[MethodImpl(MethodImplOptions.Synchronized)]是否要锁定此对象?@piyush Synchronized标志告诉编译器确保一次只有一个线程在函数中。它不会阻止两个踏板在更新中的克隆秒内同时启动。听起来您需要确保同步在两个f之间发生