C# 计时器作为结构的一部分

C# 计时器作为结构的一部分,c#,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

我有以下结构

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();
我该怎么办?

我会将其改写为:

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数据包含一个计时器,但您正在从另一个组件设置OnTimedEvent处理程序(在数据中定义)。有点不合逻辑。

我会将其改写为:

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数据包含一个计时器,但您正在从另一个组件设置OnTimedEvent处理程序(在数据中定义)。位不逻辑。

k;我现在明白错误信息了。在示例代码中,您有:

ret.aliveTimer.Elapsed += new ElapsedEventHandler(sData.OnTimedEvent);
这表明在您的真实代码中,
OnTimedEvent
static
——这解释了为什么您会收到消息(注释):

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

所以,;最初的问题是
OnTimedEvent
不应该是
静态的
。这反过来意味着事件订阅将是:

ret.aliveTimer.Elapsed += new ElapsedEventHandler(ret.OnTimedEvent);
或者简单地说:

ret.aliveTimer.Elapsed += ret.OnTimedEvent;
然而!结构上的事件订阅是。。。有风险的结构的复制语义几乎不可能将它们正确地用作事件源或订阅者
sData
显然不是一个“值”,因此它不应该是一个
struct
:它应该是一个
类。如果您有任何疑问,
涵盖了99.99%的场景
struct
非常罕见,正确使用时更为罕见,而不是认为
struct
意味着“像
但更便宜”(这不是它的意思)

我还想更改
sData
的许多特性(包括名称、公共字段的使用、公开的实现细节等)——但这是两个大问题的次要原因:

  • struct
  • static

    • k;我现在明白错误信息了。在示例代码中,您有:

      ret.aliveTimer.Elapsed += new ElapsedEventHandler(sData.OnTimedEvent);
      
      这表明在您的真实代码中,
      OnTimedEvent
      static
      ——这解释了为什么您会收到消息(注释):

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

      所以,;最初的问题是
      OnTimedEvent
      不应该是
      静态的
      。这反过来意味着事件订阅将是:

      ret.aliveTimer.Elapsed += new ElapsedEventHandler(ret.OnTimedEvent);
      
      或者简单地说:

      ret.aliveTimer.Elapsed += ret.OnTimedEvent;
      
      然而!结构上的事件订阅是。。。有风险的结构的复制语义几乎不可能将它们正确地用作事件源或订阅者
      sData
      显然不是一个“值”,因此它不应该是一个
      struct
      :它应该是一个
      类。如果您有任何疑问,
      涵盖了99.99%的场景
      struct
      非常罕见,正确使用时更为罕见,而不是认为
      struct
      意味着“像
      但更便宜”(这不是它的意思)

      我还想更改
      sData
      的许多特性(包括名称、公共字段的使用、公开的实现细节等)——但这是两个大问题的次要原因:

      • struct
      • static

      您的错误是什么?此外,为什么要使用struct而不是类?将其更改为
      ?无论如何,可变的
      struct
      s很少是个好主意。为什么要将它创建为
      struct
      ?在
      struct
      上发生的事件通常是错误的。为什么这是一个
      结构
      ?如果您不能清楚地回答为什么它是一个
      结构,那么几乎可以肯定它不应该是一个。而一个带有公共字段的可变
      struct
      只是在乞求解决问题。现在。。。“我不能在这里访问卷”是什么意思?@adam您发布的
      struct sData
      代码编译得很好。您在发布代码时是否更改了代码?注意:它编译的事实并不意味着它是合理的代码;你犯了什么错误?此外,为什么要使用struct而不是类?将其更改为
      ?无论如何,可变的
      struct
      s很少是个好主意。为什么要将它创建为
      struct
      ?在
      struct
      上发生的事件通常是错误的。为什么这是一个
      结构
      ?如果您不能清楚地回答为什么它是一个
      结构,那么几乎可以肯定它不应该是一个。而一个带有公共字段的可变
      struct
      只是在乞求解决问题。现在。。。“我不能在这里访问卷”是什么意思?@adam您发布的
      struct sData
      代码编译得很好。您在发布代码时是否更改了代码?注意:它编译的事实并不意味着它是合理的代码;pminor-tweak-我会把
      音量
      变成一个自动道具;公共领域从来都不是一个好主意。现在还不清楚
      \u aliveTimer
      将如何在这里获得非空值,或者它将如何被清除。小调整-我将使
      音量
      成为一个自动道具;公共领域从来都不是一个好主意。目前尚不清楚
      \u aliveTimer
      将如何在此处获得非空值,或者如何清除该值。