c#创建许多新对象,内存会发生什么

时间:2018-03-07 08:34:01

标签: c# memory-management static garbage-collection

我有多个线程必须访问静态对象。主线程保存此静态对象,数据库线程处理包含有关此对象的信息的数据表上的更改。 每次数据库表发生更改时,我都会等待互斥锁并更改数据库线程中的基础属性。 现在我在主线程中实现了一个静态方法,它获取了对象的深层副本,因此其他线程无法更改此对象的属性。静态方法不会创建新对象并从当前对象复制属性信息。 因此每次另一个线程需要访问此对象时,都会创建另一个新对象。 我的问题是,这是不是一种不好的做法,因为在gc到来之前记忆总是在上升? 有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

除了内存缺陷之外,新对象在其生命周期内可能不是最新的(除非您保留对所有这些对象的引用并在您的DB线程中更新所有这些对象)。

如果我理解,你想拥有一个可以由一个独特的客户端(你的数据库线程)修改的对象,但对其他actor仍然是只读的。您可以使用只读接口作为对象的契约,并使其他线程只通过它接口访问该对象

public interface IObject
{
    string Field1 { get; }
    string Field3 { get; }
    string Field2 { get; }
}

class RealObject : IObject
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}

class DBClass
{
    private RealObject _object;

    public IObject GetObject()
    {
        return _object;
    }

    ...
}

我希望这会对你有所帮助。