【发布时间】:2011-03-01 23:13:47
【问题描述】:
我有一个“经理”类的课程。它的功能之一是指示类的长时间运行的进程应该关闭。它通过在类中设置一个名为“IsStopping”的布尔值来做到这一点。
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 一个属性,然后让它调用一个可以订阅内部类的事件,但这似乎过于复杂。
另一种选择是创建一个“进程取消令牌”类,类似于 .net 4 任务使用的类,然后将该令牌传递给这些类。
您是如何处理这种情况的?
编辑:
还要考虑 MoreWork 可能有一个 EvenMoreWork 对象,它实例化并调用一个可能长时间运行的方法……等等。我想我正在寻找的是一种能够在调用树下向任意数量的对象发出信号的方法,以告诉他们停止正在做的事情并清理并返回。
EDIT2:
感谢您迄今为止的回复。似乎对使用方法没有真正的共识,每个人都有不同的意见。看来这应该是一种设计模式……
【问题讨论】:
-
使用线程还是不使用线程?因为,如果这样的事情不是多线程的,IMO 很难看到这种情况。
-
线程与否在很大程度上无关紧要。例如,它可以由 Windows 消息在具有消息泵的单线程应用程序中设置。但是,是的,我的特定实现使用线程。
标签: c# oop refactoring request-cancelling