Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.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# 如果引用永远不会被使用,那么保存对对象的引用是否会将其保留在内存中?_C#_Garbage Collection_Clr - Fatal编程技术网

C# 如果引用永远不会被使用,那么保存对对象的引用是否会将其保留在内存中?

C# 如果引用永远不会被使用,那么保存对对象的引用是否会将其保留在内存中?,c#,garbage-collection,clr,C#,Garbage Collection,Clr,我有一个集合,其中包含对对象的weakreference。 对象在运行时动态加载,并且可以由GC随机收集 有时,我需要永久删除一个对象,这是通过异步DB命令完成的。 意思-从delete命令到持久性数据库中实际提交删除操作之间有一段时间,在持久性数据库中可以对对象进行GCed,然后从数据库中重新加载 对我来说,解决这个问题最简单的方法是在每个对象中都有一个“已删除”标志(已经有一个),并且在执行删除操作时,将对已删除对象的强引用添加到DB命令对象中,这样当操作完成时,强引用将丢失,对象可以永远释

我有一个集合,其中包含对对象的weakreference。 对象在运行时动态加载,并且可以由GC随机收集

有时,我需要永久删除一个对象,这是通过异步DB命令完成的。 意思-从delete命令到持久性数据库中实际提交删除操作之间有一段时间,在持久性数据库中可以对对象进行GCed,然后从数据库中重新加载

对我来说,解决这个问题最简单的方法是在每个对象中都有一个“已删除”标志(已经有一个),并且在执行删除操作时,将对已删除对象的强引用添加到DB命令对象中,这样当操作完成时,强引用将丢失,对象可以永远释放

问题是,GC是否允许通过预读来收集我的对象?它是否适用于此场景? 我是否保证在DB命令出列并处理之前不会收集该对象

以下是一些较低级别的详细信息:

Dictionary<Int64, WeakReference> mItems;
struct IOCommand
{
    public CommandDetails command;
    public object[] strongReferences;
}
Queue<IOCommand> mIOQueue;
void queueCommand(CommandDetails command, object relatedObject)
{...}
Dictionary-mItems;
结构IOCommand
{
公共命令详情命令;
公共对象[]strong引用;
}
排队;
void queueCommand(CommandDetails命令,对象相关对象)
{...}
您可以看到,在对命令进行排队时,我将相关对象作为强引用传递到队列中,直到它被处理为止,但由于对象未被使用,问题是它们是否可以被优化掉


Amit.

只要代码对对象有(非弱)引用,它就不会被收集

所以您应该是安全的,一个(未来的)Db命令将使用引用这一事实确保它仍然存在

在这种情况下,请确保您不依赖弱引用,强引用应该具有适当的寿命


但由于对象没有被使用,问题是它们是否可以被优化掉

不可以。只要命令存储在队列中,并且只要队列可以访问,存储它们的方式就会确保它们存在


但请注意,如果它们真的没有被使用,那也没关系……

只要代码对对象有(非弱)引用,它就不会被收集

所以您应该是安全的,一个(未来的)Db命令将使用引用这一事实确保它仍然存在

在这种情况下,请确保您不依赖弱引用,强引用应该具有适当的寿命


但由于对象没有被使用,问题是它们是否可以被优化掉

不可以。只要命令存储在队列中,并且只要队列可以访问,存储它们的方式就会确保它们存在


但是请注意,如果它们真的没有被使用,那就不重要了……

GC不应该删除任何引用它的内容。WeakReference是一个例外,您特别选择让它收集您正在引用的内容。如果DB命令引用了要删除的对象,您就没事了。

GC不应该删除任何引用了它的对象。WeakReference是一个例外,您特别选择让它收集您正在引用的内容。如果DB命令引用了要删除的对象,您就没事了。

no。您可以根据需要对某个对象进行任意多(强)引用,如果无法访问该对象,则该对象可能已经被删除。如果将来不使用对象的唯一可访问引用,那么对象是否不可访问是问题的一部分。谢谢@delnan,我添加了一些代码示例来说明更好的操作。您可以根据需要对某个对象进行任意多(强)引用,如果无法访问该对象,则该对象可能已经被删除。如果将来不使用对象的唯一可访问引用,则该对象是否不可访问是问题的一部分。感谢@delnan,我添加了一些代码示例以更好地说明。请查看我是否会在堆栈上使用强引用。我知道CLR可以检查引用是否会被使用,如果不会,它可以忽略它并GC对象,问题是如果我有一个不在堆栈上的引用,它是否仍然会发生..您的问题围绕该引用的生命周期,所以请添加一些代码的概念。现在无法回答。这些对象是为了确保它们没有被释放和从DB重新加载,在内存中它们包含一个“removed”标志,指示它们的失效状态。请查看我是否会在堆栈上有强引用,我知道CLR可以检查引用是否会被使用,如果不会,它可以忽略它并GC对象,问题是如果我有一个不在堆栈上的引用,它是否仍然会发生..您的问题围绕该引用的生命周期,所以请添加一些代码的概念。现在它是无法回答的。对象在那里是为了确保它们没有被释放和从数据库中重新加载,在内存中它们包含一个“已删除”标志,指示它们的失效状态。在“向已删除对象添加强引用”之后,这一切都取决于该强引用,显示如何存储/管理该对象。使用一些代码示例更新之后“添加对已删除对象的强引用”这完全取决于该强引用,显示如何存储/管理该引用。使用一些代码示例进行更新