gpt4 book ai didi

c# - 在回调访问定时器时处理定时器

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:57 25 4
gpt4 key购买 nike

编辑这是一个简化的例子。我在 Windows 服务中有与此类似的代码。

我有以下代码。我如何才能绝对确保在停止计时器时不会收到 NullReferenceException。我想更改回调中的计时器,因为我正在做的工作可能需要不同的时间。

static Timer timer = null;

static void Main(string[] args)
{
timer = new Timer(TimerCallback, null, 5000, -1);
Console.WriteLine("Press enter to exit");
Console.ReadLine();
timer.Dispose();
timer = null;
}

static void TimerCallback(object state)
{
//do work
Console.WriteLine("Doing work");
Thread.Sleep(3000);
//do I need a lock here? or an if (timer != null)
timer.Change(5000, -1);
}

我需要这样的锁吗?这是最好的方法吗?

static void Main(string[] args)
{
timer = new Timer(TimerCallback, null, 5000, -1);
Console.WriteLine("Press enter to exit");
Console.ReadLine();
lock (timerlock)
{
timer.Dispose();
timer = null;
}
}

static void TimerCallback(object state)
{
//do work
Console.WriteLine("Doing work");
Thread.Sleep(3000);
lock (timerlock)
{
if (timer != null)
timer.Change(5000, -1);
}
}

最佳答案

是的,这是最简单和最安全的方法。

您正在访问共享状态 - timer 字段。任何对共享状态的多线程访问都必须同步,这就是 lock 的用途。这真的很简单:)

但是,请注意,您并不是在等待完成计时器回调 - 如果您的应用程序退出,回调将在中途中止。当然,这可能会给您带来麻烦。

解决这个问题的最简单方法是使用一些信号原语来确保主线程等待回调完成。

关于c# - 在回调访问定时器时处理定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33799938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com