我把“挥发性”放在一边,因为它只是模糊不清。
我有一个名为StopRequested
的属性的类。这个标志可以随时由其他线程设置,并且需要向我的代码指示它应该停止它正在做什么并退出(这是一个基于Windows服务的进程,并且当调用Stop时,所有处理都需要清理和停止)。
我希望创建一些其他类来完成处理工作的实际冲击,但是这些类也必须知道“停止”标志。您不能只传递该标志,因为它将传递一个副本,并且您不能将属性作为ref
类型传递。
那么如何将可能随时更改的属性传播到其他类中?
我唯一能想到的是传递对父类的引用,但我不喜欢将worker类与父类耦合为一个标志。任何建议将不胜感激。
编辑:
这是一个基本的例子:
public class A
{
public bool StopRequested { get; set; }
private Worker = new Worker();
public void DoWork();
{
worker.DoWork();
}
}
public class Worker
{
public void DoWork()
{
while(!StopRequested)
{
....
}
}
}
答案 0 :(得分:1)
您可以让每个工作类都有自己的StopRequest属性,然后只要标记StopRequest就设置它。
private List<IStopable> WorkerClasses = new List< IStopable > ()
public Bool StopRequest{
get
{
return _stopRequest;
}
set
{
_stopReqest = value;
foreach (var child in WorkerClasses)
child.StopRequest = value;
}
}
答案 1 :(得分:1)
像鲁本斯所说,使用一个事件。您所描述的内容基本上将事件定义为T:
将属性更改传播到其他类。
.NET中实际上有一个工具已经提供了这个功能,虽然它是通用的:INotifyPropertyChanged。此接口提供单个事件PropertyChanged,允许类通知任何侦听器任何属性更改。
在您的情况下,您可以轻松提供更具体的界面:
interface IStopNotifier
{
event EventHandler StopRequested;
}
此接口将由您的主要工作经理(无论它是什么)实现,并且可以像这样传播:
class WorkManager: IStopNotifier
{
public event EventHandler StopRequested;
protected void OnStopRequested()
{
if (StopRequested != null) StopRequested(this, new EventArgs());
}
public void StopAllWorkers()
{
OnStopRequested();
}
public Worker CreateWorker<T>()
where T: Worker
{
var worker = new T(this);
return worker;
}
}
class abstract Worker: IDisposable
{
public Worker(IStopNotifier stopNotifier)
{
stopNotofier.StopRequested += HandleStopRequested;
}
private IStopNotifier m_stopNotifier;
private bool m_stopRequested = false;
internal void HandleStopRequested(object sender, EventArgs e)
{
m_stopRequested = true;
}
public void Dispose()
{
m_stopNotifier.StopRequested -= HandleStopRequested;
}
}
答案 2 :(得分:0)
为什么不创建一个事件来处理停止请求?