如何在构造函数中使用定时器?

4

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

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

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

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);
}

如果您需要每分钟传递其他数据凭据,则计时器的调用需要在类外部发生。如果您可以每次使用相同的数据凭据,那么或许应该将其作为参数传递给构造函数? - Patrick Allwood
如果你没有提供dataCredentials,那么GetData应该如何运作呢?如果你没有告诉构造函数如何调用它,那么构造函数能够调用它就没有意义。 - Rob
1个回答

1
你可以将 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) {...}
}

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

但是在构造函数中,他需要设置什么来代替 ? - user5515846
答案已更新。如果您认为它有价值,请考虑将其投票为最佳答案。 - Nick Louloudakis
那么,DataUpdateTimer_Elapsed 的第一次调用将使用空凭据?你在哪里更新它? - user5669286
不,+= 不会立即调用它,它会将其注册,以便在时间到期时调用。 这是一个回调函数,请搜索此机制。 - Nick Louloudakis
你不能在“定时器”中传递一个“int”。因为“int”无法赋值给参数“TimerCallback”。 - user5669286
你说得对,已经更新。尽管对于System.Timers.Timer而言,Double类型仍然有效。 - Nick Louloudakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接