C# 在没有无限计算资源的程序中,如何允许循环性的概念?

C# 在没有无限计算资源的程序中,如何允许循环性的概念?,c#,circular-reference,C#,Circular Reference,这听起来可能是一个非常奇怪的问题。但我在一个项目上工作,这个项目需要有循环引用。事实上,它们甚至是无法避免的。因为用户可以在GUI中创建自己的循环引用。这绝对是有意的。。。。请不要问为什么,这需要很长时间才能解释 我发现的所有讨论循环引用的问题、答案和资源都提供了如何避免循环引用的解决方案和方法。但我读过的非标准文件中包含了一个解决方案,即如何在不破坏底层计算资源的情况下制作一个 我看到的问题 在我看来,这样一个简单的参考似乎总是有可能完全控制底层系统,无论是一台简单的家用计算机还是运行该程序的

这听起来可能是一个非常奇怪的问题。但我在一个项目上工作,这个项目需要有循环引用。事实上,它们甚至是无法避免的。因为用户可以在GUI中创建自己的循环引用。这绝对是有意的。。。。请不要问为什么,这需要很长时间才能解释

我发现的所有讨论循环引用的问题、答案和资源都提供了如何避免循环引用的解决方案和方法。但我读过的非标准文件中包含了一个解决方案,即如何在不破坏底层计算资源的情况下制作一个

我看到的问题

在我看来,这样一个简单的参考似乎总是有可能完全控制底层系统,无论是一台简单的家用计算机还是运行该程序的研究超级计算机

这是因为我的理解是,提供的资源总是有限的,但循环引用本质上是无限的

我看到这里可能存在问题的资源有:

  • 计算能力(CPU)
  • 工作存储器(RAM)
  • 数据存储
  • 网络带宽
如何才能缓解这些问题

通过确保程序本身只能以非常小的增量方式增加其对计算资源的需求,可以实现缓解。如果实施了基于整个系统作为一个单元收集的数据的措施,则允许我们决定是否需要进一步改进以提高系统的感知质量。这将帮助我们限制对计算资源的需求

我可以想象这种封顶可能发生的方式之一是引入时间作为限制因素。该程序可以这样设计,即它只考虑在给定的时间后重新评估“自身”。如果仔细选择这个时间和质量限制来匹配底层计算资源,我觉得循环引用的资源问题可以得到缓解

代码片段

下面是一段非常简化的代码片段。第1点和第2点本质上是完全独立的,它们甚至可以在不同的线程上(实际上这是一个如何实现的想法,但我对多线程的理解还不足以决定这是否是一个好方法)。当它们连接到另一个对象时,操作首先开始。我不在乎“先此后彼”的行为是否以特定方式发生。我唯一关心的是,这两点之间的所有交互都是在将来的某个时候发生的(在它们连接之后)

名称空间循环
{
班级计划
{
静态void Main(字符串[]参数)
{
点1=新点();
点2=新点();
点1.连接(点2);
}
}
类点
{
私人乌龙价值;
公共点()
{
值=ulong.MaxValue/2;
}
公共无效附加(点其他点)
{
如果(值

此代码立即导致堆栈溢出。但我对堆栈的基本概念了解不够,无法实现相应的措施。我已经尝试在这里应用时间概念,但堆栈溢出只需要更长的时间。

导致堆栈溢出的原因是您递归调用
attach
,因此您只需继续添加堆栈帧,CLR无法处理那么多,正如您所看到的,它很快就会达到最大值。这里的一个策略是使用延续传递样式,这样可以避免构建方法调用堆栈


堆栈溢出的原因是您递归调用了
attach
,因此您只需不断添加堆栈帧,CLR无法处理那么多,正如您所看到的,它很快就会达到最大值。这里的一个策略是使用延续传递样式,这样可以避免构建方法调用堆栈


在任何情况下,解决方案都必须具有极强的可扩展性。其中一点甚至可能是它自己的微服务在云中运行。没有任何对策可以避免这一点。调用
Point1.Attach()
时,
Attach()
递归调用
Point2中的
Attach()
。这个
Attach()
然后再次调用
Point1
中的
Attach()
,循环从头开始。理论上,这会在某个点停止,但在附加递归停止之前,
Value
=18446744073709551615/2,并且这两个点都必须达到
ulong.MaxValue()
。在到达
MaxValue()
之前,很长一段时间都会使堆栈溢出。你需要提供更多的细节,也许是一个更具体的例子,并以另一种方式实现你的解决方案。你能用文字描述一下你希望函数
attach
做什么吗?我一点也不明白你对这段文字的理解:我不在乎“先此后彼”的行为是否以特定的方式发生。我唯一关心的是,这两点之间的所有交互都是在将来的某个时候发生的(在它们连接之后)。我不明白你在这个问题上寻找什么,因为你说任何循环引用的检测/预防都不是你感兴趣的。。。具有正反馈回路且没有自然边界的系统总是爆炸的。。。所以,我再一次不确定无限循环是一个你想要实现的良好行为的例子。等等……你认为即使有无限内存,它也会终止吗?因为它没有<代码>附加
始终调用另一个namespace Circularity { class Program { static void Main(string[] args) { Point Point1 = new Point(); Point Point2 = new Point(); Point1.attach(Point2); } } class Point { private ulong Value; public Point() { Value = ulong.MaxValue / 2; } public void attach(Point otherPoint) { if (Value < ulong.MaxValue) Value++; otherPoint.attach(this); } } }