对象中的C#Thread-Safe集合

时间:2013-07-31 15:08:19

标签: c# thread-safety

这只是用来说明我的问题的示例代码。

假设我有以下课程:

enter code here
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Concurrent;


namespace BoxesA4
{
class Box
{
    public double length { get; set; }
    public double width { get; set; }
    public double height { get; set; }

ConcurrentDictionary<int, string> boxItems = new ConcurrentDictionary<int, string>();


    public Box(double length,double width,double height)
    {
        this.length=length;
        this.width = width;
        this.height = height;

    }

    public double volume()
    {
        return this.length * this.width * this.height;
    }

    public void add(int index,string item)
    {
        boxItems.TryAdd(index, item);

    }



    }
}

主:

    static void Main(string[] args)
    {
       Box createBox = new Box(10,10,5,5);
       createBox.add(0,"hammer");
       createBox.add(1,"saw");

    }

在我的main方法中,我调用了createBox.add();并传递必要的论据。在调用我的add方法时,我是否必须担心线程安全? 我不想让Box类静态。如果线程安全是一个问题,我将如何修复我的代码?

2 个答案:

答案 0 :(得分:1)

假设ConcurrentDictionary.TryAdd的行为符合您的要求,您就可以了。如果您将boxItems字段设为只读,那么您将处于更好的位置。

当您使用并发集合时,有必要详细阅读文档,以确切了解可能发生的情况。例如,可能想要AddOrUpdate而不是TryAdd - 如果密钥已经存在于字典中,那么想要会发生什么?

答案 1 :(得分:0)

Thread safety is not an issue in your case。你的box.add方法有效地添加到线程安全的Concurrent dictionary。所以你不必担心线程安全。