gpt4 book ai didi

c# - 如何取消深度嵌套的进程

转载 作者:太空狗 更新时间:2023-10-30 01:11:15 24 4
gpt4 key购买 nike

我有一个类是“经理”类的类。它的功能之一是发出该类的长期运行进程应该关闭的信号。它通过在类中设置一个名为“IsStopping”的 bool 值来实现。

public class Foo
{
bool isStoping

void DoWork() {
while (!isStopping)
{
// do work...
}
}
}

现在,DoWork() 是一个巨大的函数,我决定将其重构出来,并且作为该过程的一部分,将其中的一些分解到其他类中。问题是,其中一些类还具有长时间运行的函数,需要检查 isStopping 是否为真。

public class Foo
{
bool isStoping

void DoWork() {
while (!isStopping)
{
MoreWork mw = new MoreWork()
mw.DoMoreWork() // possibly long running
// do work...
}
}
}

我有哪些选择?

我考虑过通过引用传递 isStopping,我不太喜欢这种方式,因为它需要有一个外部对象。我宁愿让额外的类尽可能独立和无依赖性。

我还考虑过使 isStopping 成为一个属性,然后让它调用一个可以订阅内部类的事件,但这似乎过于复杂。

另一种选择是创建一个“进程取消 token ”类,类似于 .net 4 Tasks 使用的类,然后将该 token 传递给这些类。

您是如何处理这种情况的?

编辑:

还要考虑 MoreWork 可能有一个 EvenMoreWork 对象,它实例化并调用可能长时间运行的方法...等等。我想我正在寻找的是一种能够向调用树下的任意数量的对象发出信号,告诉它们停止正在做的事情并清理并返回的方法。

编辑2:

感谢到目前为止的回复。使用方法似乎没有真正的共识,每个人都有不同的看法。看起来这应该是一种设计模式......

最佳答案

这里有两种方式:

1) 您已经概述的解决方案:将信号机制传递给您的从属对象:一个 bool(通过 ref),父对象本身隐藏在一个接口(interface)中(Foo: IController 在下面的示例)或其他内容。子对象根据需要检查信号。

// Either in the MoreWork constructor
public MoreWork(IController controller) {
this.controller = controller;
}

// Or in DoMoreWork, depending on your preferences
public void DoMoreWork(IController controller) {
do {
// More work here
} while (!controller.IsStopping);
}

2) 将其翻转并使用 observer pattern - 这将使您可以将您的从属对象与父对象分离。如果我手动完成(而不是使用事件),我会修改我的从属类以实现一个 IStoppable 接口(interface),并让我的管理类告诉他们何时停止:

public interface IStoppable {
void Stop();
}

public class MoreWork: IStoppable {
bool isStopping = false;
public void Stop() { isStopping = true; }
public void DoMoreWork() {
do {
// More work here
} while (!isStopping);
}
}

Foo 维护其可停止项的列表,并在其自己的停止方法中将它们全部停止:

public void Stop() {
this.isStopping = true;
foreach(IStoppable stoppable in stoppables) {
stoppable.Stop();
}
}

关于c# - 如何取消深度嵌套的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3011141/

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