首页 > 解决方案 > 自动属性获取和设置在回调方法c#中不起作用

问题描述

嗨,我只是想从静态自动属性中获取值,如下所示 -

这是我的课-

public class ShutdownService
{
  private const int TimerInterval = 6000;
  private static DateTime _midnightStartTime;

  public static bool TimeForMidNightShutDown{get; set;}

  public static void Start(){
   _midnightStartTime = DateTime.Now.AddMinutes(4);
   _timer = new Timer(StartTask, null, 0, TimerInterval);
  }

  public static void StartTask(object state){
    if(DateTime.Now >= _midnightStartTime){
      TimeForMidNightShutDown = true;
    } else {
      TimeForMidNightShutDown = false;
    } 
  }
}

我在启动应用程序时调用了这个启动方法。如果我在 上放置一个调试点if(DateTime.Now >= _midnightStartTime),它会将TimeForMidNightShutDown属性值设为 true。但是当我从其他类调用这个属性时ShutdownService.TimeForMidNightShutDown,它总是返回我为假。我不确定我在这里错过了什么。你能指导一下吗?

标签: c#.netoop

解决方案


我不完全知道为什么静态的东西不起作用。因此,我不想提供错误的线索,而是想给你一个不使用静态的工作示例,这可能会导致你的问题:

public class ShutdownService
{
    private const int TimerInterval = 6000;
    private DateTime _midnightStartTime;
    private bool disposerFlag;

    public bool TimeForMidNightShutDown{get; set;}

    public void Start(){
        _midnightStartTime = DateTime.Now.AddMinutes(1);
        var _timer = new Timer(StartTask, null, 0, TimerInterval);
        while (!disposerFlag)
        {
            
        }

        _timer.Dispose();
    }

    public void StartTask(object state)
    {
        if(DateTime.Now >= _midnightStartTime)
        {
            TimeForMidNightShutDown = true;
            Console.WriteLine("true");
            disposerFlag = true;
        } 
        else 
        {
            TimeForMidNightShutDown = false;
            Console.WriteLine("false");
        } 
    }
}

此代码可以在 main 方法中的 Programm.cs 上执行

new ShutdownService().Start();

空的 while 循环非常重要,因为程序不会等待计时器完成其职责。我相信你也可以用一些异步方法或静态方法更优雅地解决它,但这是一个快速工作的模型。希望能帮助到你。我完全愿意在这里进行改进。


推荐阅读