2 cqtrq cqtrq 于 2015.07.23 20:57 提问

关于System.Threading.Timer

MSDN上的例子:

using System;
using System.Threading;

public class Example
{
    private static Timer ticker;

    public static void TimerMethod(object state)
    {
        Console.Write(".");
    }

    public static void Main()
    {
        ticker = new Timer(TimerMethod, null, 1000, 1000);

        Console.WriteLine("Press the Enter key to end the program.");
        Console.ReadLine();
    }
}

问题:Timer的第2个参数为什么是null?MSDN上有解释说“对于任何托管对象,如果没有对 Timer 的引用, Timer 会被垃圾回收,即使 Timer 仍处在活动状态。”这个null是否和后面的解释矛盾?

4个回答

caozhy
caozhy   Ds   Rxr 2015.07.23 23:00
已采纳

https://msdn.microsoft.com/zh-cn/library/2x96zfy7.aspx

一个包含回调方法要使用的信息的对象,或者为 null。

可以为null,说的很清楚。

第二个参数只是传一个初始的状态,和引用不引用无关啊。比如说,你创建10个定时器,这个参数就可以用来给每个定时器编号。

cqtrq
cqtrq 回复caozhy: 谢谢!
2 年多之前 回复
caozhy
caozhy 回复cqtrq: 这个参数可以是任何的值,你传一个整数不就是编号了。
2 年多之前 回复
cqtrq
cqtrq AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;看到使用了的,但是如何用来给多个定时器编号呢?还请指点一下,谢谢!
2 年多之前 回复
cqtrq
cqtrq 回复caozhy: MSDN的这个例子中,stateInfo这个参数在代码中没有使用,应该是指调用CheckStatus方法的autoEvent事件,一个事件对象如何给定时器编号?
2 年多之前 回复
caozhy
caozhy 回复cqtrq: 你看public void CheckStatus(Object stateInfo) 这个参数就是你初始化的时候给的
2 年多之前 回复
caozhy
caozhy https://msdn.microsoft.com/zh-cn/library/2x96zfy7.aspx
2 年多之前 回复
cqtrq
cqtrq 明白了,不是引用对象。如何利用该参数对象进行定时器编号?麻烦示例下,谢谢!
2 年多之前 回复
sina_2831808769
sina_2831808769   Rxr 2015.07.25 13:41

https://msdn.microsoft.com/zh-cn/library/2x96zfy7.aspx

一个包含回调方法要使用的信息的对象,或者为 null。

可以为null,说的很清楚。

第二个参数只是传一个初始的状态,和引用不引用无关啊。比如说,你创建10个定时器,这个参数就可以用来给每个定时器编号。

CSDNXIAOC
CSDNXIAOC   2015.07.23 20:59

 System.Threading.Timer 是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。 只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。 使用 TimerCall......
答案就在这里:System.Threading.Timer
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

strutce
strutce   Ds   Rxr 2015.07.23 22:00

定时器的id一个包含回调方法要使用的信息的对象,或者为空引用

Csdn user default icon
上传中...
上传图片
插入图片