传播“易变”财产

时间:2009-11-05 02:53:30

标签: c# oop properties

我把“挥发性”放在一边,因为它只是模糊不清。

我有一个名为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)
        {
            ....
        }
    }
}

3 个答案:

答案 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)

为什么不创建一个事件来处理停止请求?