我可以在回调中处理Threading.Timer吗?

eba*_*eba 6 .net dispose timer callback

我正在使用Threading.Timer,如:

new Timer(new TimerCallback(y=>
{
    try
    {
        Save(Read(DateTime.Now));
        // here i want to dispose this timer
    }
    catch
    {                          
    }
}),null,100000,10000);
Run Code Online (Sandbox Code Playgroud)

如何在回调中处理此计时器.或解决方法?更新:让我解释一下情况.我想尝试调用方法"保存",同时抛出异常.如果它工作,我需要停止计时器.

Jak*_*sen 15

试试这个:

Timer timer = null;
timer = new Timer(new TimerCallback(y =>
{    
    try    
    {
        Save(Read(DateTime.Now));        
        // here i want to dispose this timer
        timer.Dispose();    
    }    
    catch    
    {    
    }
}));
timer.Change(10000, 10000);
Run Code Online (Sandbox Code Playgroud)

编辑:

我根据Chuu的建议稍微修改了上面的代码.请注意,如果通过不同的计时器事件同时调用TimerCallback,则Timer.Dispose可能最终被多次调用.幸运的是,Timer它不关心它是否被处理了好几次.

  • 我不认为这是100%线程安全的,理论上可能发生以下(非常不可能)系列事件:1.创建定时器.2. <上下文切换> 3. Threadpool 4上的回调触发.<上下文切换> 5.分配发生.线程安全的方法可能是创建具有无限超时的计时器以在线程池回调之前强制赋值,然后使用Change()来设置重复出现的属性. (3认同)