计时器作为结构的一部分

时间:2012-06-07 07:45:24

标签: c#

我有以下结构

private struct sData{
    public int volume;      
    public System.Timers.Timer aliveTimer;
    public void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("this = " + volume);// I cannot access volume here
    }
}

当时间过去我想要改变音量值而我无法在OnTimedEvent中访问它 我使用此代码来启动结构和计时器:

sData ret = new sData();
ret.volume = rand.Next(1, 10) * 100;    
ret.aliveTimer = new System.Timers.Timer(1000);
ret.aliveTimer.Elapsed += new ElapsedEventHandler(sData.OnTimedEvent);
ret.aliveTimer.Start();

我该怎么办?

2 个答案:

答案 0 :(得分:2)

K表;我现在理解错误信息。在您的示例代码中,您有:

ret.aliveTimer.Elapsed += new ElapsedEventHandler(sData.OnTimedEvent);

表示在您的真实代码中,OnTimedEventstatic - 这解释了您收到消息的原因(评论):

  

非静态字段,方法或属性需要对象引用< TimerTester.Form1.sData.volume

因此;最初的问题是OnTimedEvent不应该是static。这反过来意味着事件订阅将是:

ret.aliveTimer.Elapsed += new ElapsedEventHandler(ret.OnTimedEvent);

或简单地说:

ret.aliveTimer.Elapsed += ret.OnTimedEvent;

然而!结构上的事件订阅是有风险的。结构的复制语义使得它几乎不可能正确地用作事件源或订阅者。 sData 明确不是"值",所以它根本不应该是struct:它应该是class 。如果您有任何疑问,class涵盖了99.99%的情景。 struct 非常罕见,甚至在使用正确时更为罕见,而不是认为struct表示"如{{1}的人但更便宜" (这不是它的意思)。

我还会更改class的许多功能(包括名称,公共字段的使用,公开的实现细节等) - 但这是次要的两个大问题:

  • sData
  • 的使用感到困惑
  • struct
  • 的使用感到困惑

答案 1 :(得分:1)

我会把它重写为:

private class Data{
    public int Volume {get; set; }      
    private System.Timers.Timer _aliveTimer;

    public Data() 
    {   
        _aliveTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    }

    public void Start() 
    {
        _aliveTimer.Start();
    }

    private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("this = " + volume);
    }
}

Data ret = new Data();
ret.Volume = rand.Next(1, 10) * 100;    
ret.Start();

使用类总是比结构更好的主意。 Furthurmore Data包含一个计时器,但您正在设置另一个组件的OnTimedEvent处理程序(在Data中定义)。有点不合逻辑。

相关问题