使用 TimerCallback 时在静态 class 中使用 'global' 变量的替代方法

Alternative to using 'global' variables in a static class when using a TimerCallback

我正在使用 TimerCallback 方法每 5 秒向屏幕显示一次统计信息,如下所示:

var timerCallback = new TimerCallback(_outputDisplayer.SetupThreading);
var stateTimer = new Timer(timerCallback, null, 0, 5000);

我有一个静态 class 保存我正在计算的统计变量。当计时器关闭时,调用 outputDisplayer class 中的方法并显示它们的值。

public static class Properties
{
  public static decimal PercentOfChocolateIceCream { get; set; }  = 0
  public static decimal PercentOfRedCars { get; set; } = 0
}

由于我没有自己调用显示统计信息的方法,所以我一直在使用这个静态 class 中的字段。如果没有静态 class 和变量,有没有更好的方法来做到这一点?

改为使用实例 class,并将实例传递给计时器的构造函数。您的回调可以从传递给它的 state 参数中读取它。

public class Properties
{
    public decimal PercentOfChocolateIceCream { get; set; }  = 0
    public decimal PercentOfRedCars { get; set; } = 0
}

var properties = new Properties();
var timerCallback = new TimerCallback(_outputDisplayer.SetupThreading);
var stateTimer = new Timer(timerCallback, properties, 0, 5000);



void SetupThreading(object? state)
{
    var properties = (Properties)state;

    //etc...