C#计时器回调在每个循环中使用函数返回的值

时间:2018-08-16 10:58:01

标签: c# timer callback

我想实现一些我不知道是否可以实现的目标,但是什么也没做...

i有一个称为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的值(每次循环结束时都会改变)乘以毫秒。

这甚至有可能吗?

2 个答案:

答案 0 :(得分:2)

实例化计时器时,实际上是将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调用每次更改值时的毫秒数。

答案 1 :(得分:0)

如何在主体外部声明x,将其作为对象传递给回调函数。

+---+-----------------------------------------------------------+
| id| merged columns                                            |
+---+-----------------------------------------------------------+
|  1| [{name: animal, value: bat}, {name: talk, value: done}]   |
|  2| [{name: animal, value: mouse}, {name: talk, value: mone}] |
|  3| [{name: animal, value: horse}, {name: talk, value: gun}]  |
|  4| [{name: animal, value: horse}, {name: talk, value: some}] |
+---+-----------------------------------------------------------+

将其传递给增量方法。

Array

并在回调中将其从传递给委托的对象中获取?

case class merged(name:String, value: String)

您需要设置何时停止该条件,因为public Int x = 0; public static void Main(string[] args) { Timer t = new Timer(TimerCallback, x, 0, x * 1000); Console.ReadLine(); } 会变得非常大。这只是设置为运行indefinitley。