我有一个多线程的C#应用程序,在DLL中使用一些递归函数。我的问题是如何干净地停止递归函数。停止DLL循环
递归函数用于遍历我们的SCADA系统的层次化'SCADA对象'数据。遍历数据需要很长时间(10分钟),具体取决于系统的大小以及我们需要处理的数据。
当我开始工作时,我创建了一个后台线程,以便GUI保持响应。然后后台工作人员处理dll中递归函数的调用。
我可以使用CancelAsync向后台工作人员发送取消请求,但后台工作人员无法检查CancellationPending标志,因为它被阻止等待dll的递归函数完成。
通常,一次只有一个递归函数处于活动状态,但有几十个递归函数会在不同时间由不同的后台工作人员使用。
作为一种快速(而且非常可耻)的破解,我在dll中添加了一个全局的'CodeEnabled'标志。因此,当GUI执行CancelAsync时,它也会将'CodeEnabled'标志设置为false。 (我知道我需要一些错误的代码偏移量)。然后dll的递归循环检查'CodeEnabled'标志并返回到最终能够停止的后台工作者。
我不想将递归逻辑移动到后台工作线程,因为我在其他地方需要它(例如其他后台工作者)。
这种类型的问题应该采用哪种方法?
你的权利关于递归被堆栈或队列取代。我想这个问题只是停止任何循环。 递归函数是我继承的代码。我写的很多新的循环方法都是实际的迭代器模块。我发现那些更有用。它保持方法非常短(时间明智),调用方法(本例中的后台工作者)仍然可以自然地关闭循环。 我不愿意重写代码。我会分解并做这项工作。我认为在我的情况下,迭代器块是一个更好的选择。 谢谢。 – rthompson 2010-01-15 14:52:22