gpt4 book ai didi

c# - 停止dll循环

转载 作者:行者123 更新时间:2023-12-03 13:18:08 24 4
gpt4 key购买 nike

我有一个多线程C#应用程序,该应用程序在dll中使用了一些递归函数。我的问题是如何彻底停止递归函数。

递归函数用于遍历我们的SCADA系统的分层“SCADA对象”数据。遍历数据需要很长时间(10分钟),这取决于我们系统的大小以及我们需要对数据进行的处理。

当我开始工作时,我会创建一个后台线程,以便GUI保持响应状态。然后,后台工作程序处理dll中递归函数的调用。

我可以使用CancelAsync向后台工作人员发送取消请求,但是后台工作人员无法检查CancellationPending标志,因为它被阻止等待dll的递归函数完成。

通常,一次一次只有一个递归函数处于 Activity 状态,但是不同的后台工作人员在不同时间使用数十个递归函数。

作为一种快速(非常可耻的)黑客,我在dll中添加了一个全局'CodeEnabled'标志。因此,当GUI执行CancelAsync时,它还会将'CodeEnabled'标志设置为false。 (我知道我需要一些不良的代码偏移量)。然后,dll的递归循环检查“CodeEnabled”标志,并返回到最终能够停止的后台工作程序。

我不想将递归逻辑移至后台工作线程,因为我需要在其他地方(例如其他后台工作)使用它。

对于这种类型的问题,应使用其他什么方法?

最佳答案

确实,这取决于设计。可以用(例如)本地堆栈(Stack<>)或队列(Queue<>)代替很多递归,在这种情况下,可以在本地保留一个取消标志而不会带来太多麻烦。另一种选择是使用某种进度事件,该事件允许订阅者设置取消标志。第三种选择是将某种上下文类传递给函数,并带有可以设置的( volatile 或同步)标志。

在任何这些情况下,您都应该可以相对轻松地访问cancel标志以退出递归。

FooContext ctx = new FooFontext();
BeginSomeRecursiveFunction(ctx);
...
ctx.Cancel = true; // or ctx.Cancel(), whatever

与(在您的接受上下文的函数中):
if(ctx.Cancel) return; // or maybe throw something
// like an OperationCancelledException();
blah...
CallMyself(ctx); // and further down the rabbit hole we go...

另一个有趣的选择是使用 iterator blocks for your long function而不是常规代码。那么您的调用代码只要有足够的代码,就可以简单地停止迭代。

关于c# - 停止dll循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2069871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com