【问题标题】:C# Timer Callback to use returned value from a function every loopC# Timer Callback 在每个循环中使用函数的返回值
【发布时间】:2018-08-16 10:58:00
【问题描述】:

我想实现一些我不知道是否可能的事情,但是什么都没有......

我有一个名为 X 的静态 int 变量,以及一个递增 X 然后返回新值的函数。

 public static int X;

 public int ReturnInt()
    {
        X = X + 1
        return x;
    }

我还有另一个函数是 TimerCallBack 函数,它将每 N 毫秒循环一次。

public static void TimerCallback(Object o)
    {
        y = ReturnInt();
        Console.WriteLine("Value:" + y);
        GC.Collect();
    }

然后在主函数中:-

public static void Main(string[] args)
    {


        Timer t = new Timer(TimerCallback, null, 0, X * 1000);
        Console.ReadLine();
    }

此应用程序仅适用于第一个循环,因为它只能在 Timer 的第一个循环中看到 X 的增量值,然后保持不变而不更新。

所以输出是:

Value:1

我想要做的是使用 Timer 函数的最后一个参数将 X 的值(因为它每次循环结束时都会改变)乘以毫秒。

这可能吗?

【问题讨论】:

  • @Sean T 你能解释一下应该怎么做吗?
  • 我在下面添加了一个答案,应该足以让你上路

标签: c# timer callback


【解决方案1】:

当您实例化您的 Timer 时,您实际上所做的是将 dueDateperiod 都设置为 0(X 在开始时为 0)。 dueDate 等于 0 表示计时器立即启动,period 0 表示不再重复。这很奇怪,因为在文档中它说您应该指定 System.Threading.Timeout.Infine 来禁用周期性信号。

您可以尝试这样的方法来更改TimerCallback 调用之间的时间间隔:

public static int X;
public static Timer timer;
public static int ReturnInt()
{
    X = X + 1;
    return X;
}

public static void TimerCallback(object o)
{
    var y = ReturnInt();
    Console.WriteLine("Value:" + y);
    timer.Change(y * 1000, 0);
    GC.Collect();
}

public static void Main(string[] args)
{
    timer = new Timer(TimerCallback, null, 0, 0);
    Console.ReadLine();
}

Main 中,您创建一个立即运行的计时器,在TimerCallback 方法中,您使用timer.Change(y * 1000, 0) 更改计时器属性,因此每次值更改时都会在 y * 1000 毫秒时调用该方法.

【讨论】:

  • 非常感谢,这正是我想要的
【解决方案2】:

在主体外部声明 x 怎么样,将它作为 aboject 传递给回调。

public Int x = 0;

public static void Main(string[] args)
{
    Timer t = new Timer(TimerCallback, x, 0, x * 1000);
    Console.ReadLine();
}

将其传递给增量方法。

private int ReturnInt(int x)
{
    x = x + 1
    return x;
}

在您的回调中,您从传递给委托的对象中获取它?

private void TimerCallback(int x)
{
    var y = ReturnInt(x);
    Console.WriteLine("Value:" + y);
    GC.Collect();
}

您需要设置一些条件何时停止此操作,因为x 会很快变得非常大。这只是设置为无限运行。

【讨论】:

  • @MahmoudElbably 好吧,由于某种原因,您已将 x 声明为 private。那不是我发布的内容
  • 这是c#msdn.microsoft.com/en-us/library/ms973875.aspx中范围和关键字的有用参考
  • 我更改了它,但它说:无法从“方法组”转换为“TimerCallback”
  • Timer t = new Timer(TimerCallback, x, 0, x * 1000);
  • 这是因为已经有一个名为TimerCallback的方法我认为-将其名称更改为其他名称
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 2018-04-25
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2020-02-08
相关资源
最近更新 更多