如何在构造函数内部使用Timer

本文关键字:Timer 内部 构造函数 | 更新日期: 2023-09-27 18:26:23

我的类中有一个以DataCredentials为参数的公共方法,我需要每分钟触发一次该方法

public Data GetData(DataCredentials dataCredentials) {...}

我知道我可以使用Timer来解决当前的问题:

public class DataService : IDataService
{
    private Timer _dataUpdateTimer;
    private readonly TimeSpan _updateInterval = TimeSpan.FromMinutes(1);
    public DataService()
    {
        _dataUpdateTimer = new Timer(GetData(?),
                                     null,
                                     TimeSpan.Zero,
                                     _updateInterval);
    }
    public Data GetData(DataCredentials dataCredentials) {...}
}

但是我怎么知道DataCredentials呢?

在此之前,我在其他类内部调用此方法,如下所示:

public Data GetCached(DataCredentials dataCredentials)
{
    return _dataService.GetData(dataCredentials);
}

如何在构造函数内部使用Timer

您可以获取GetData(....)上所需的参数作为构造函数参数,并将其作为类中的字段。

然后,为计时器设置一个经过的回调,然后启动它(使用System.Timers.Timer)。结束后,调用您的代码,然后重新启动计时器:

public class DataService : IDataService
{
    private const double UpdateInterval = 1000; //1000ms = 1s
    private readonly DataCredentials _credentials;
    private Timer _dataUpdateTimer;

    public DataService(DataCredentials credentials)
    {
        _credentials = credentials;
        _dataUpdateTimer = new Timer(UpdateInterval);
        _dataUpdateTimer.Elapsed += DataUpdateTimer_Elapsed;
        _dataUpdateTimer.Start();
    }
    private void DataUpdateTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        //Call your code in here
        var data = GetData(_credentials);
        //.....
        //Reset your timer
        _dataUpdateTimer.Stop();
        _dataUpdateTimer.Start();
    }
    public Data GetData(DataCredentials dataCredentials) {...}
}

更新:如果您想知道在间隔中获取数据后如何使用数据,我建议您实现并使用观察者模式,即:注册对这些数据感兴趣的所有对象,然后通知在每个间隔将所有数据发送给它们。