System.Timers.Timer线程未退出,停止控制台应用程序以完成
本文关键字:控制台 应用程序 Timer Timers 线程 退出 System | 更新日期: 2023-09-27 18:12:08
我有一个非常简单的控制台应用程序,它触发定时器。每2秒经过一次。控制台应用程序退出,但我仍然在任务管理器中看到我的Console.exe具有固定的内存,固定的线程和0 CPU使用率。这是我的简单控制台应用程序,
private static bool _allWorkFinsihed;
private static Timer _timer;
private static readonly object Lock = new object();
private static void Main()
{
SetTimer();
while (true)
{
lock (Lock)
{
if (_allWorkFinsihed)
{
_timer.Enabled = false;
_timer.Dispose();
break;
}
}
Thread.Sleep(2000);
}
}
private static void SetTimer()
{
_timer = new Timer(2000.0);
_timer.Elapsed += (sender, args) =>
{
lock (Lock)
{
DoBackgroundStuff();
}
};
lock (Lock)
{
_timer.Enabled = true;
}
}
private static void DoBackgroundStuff()
{
if (_allWorkFinsihed || !_timer.Enabled)
{
return;
}
_timer.Enabled = false;
// Do my Background stuff
if (condition)
{
_allWorkFinsihed = true;
}
_timer.Enabled = true;
}
我发现它是工作的控制台。vshost.exe混淆了我。
您初始化的计时器以某种方式保持程序存活。为此,您需要处理它。
例如:
using (var t = SetTimer())
{
while (true)
{
lock (Lock)
{
if (_allWorkFinsihed)
{
t.Enabled = false;
t.Dispose();
break;
}
}
Thread.Sleep(2000);
}
t.Enabled = false;
}
注意,在本例中,SetTimer
返回新构造的Timer
对象。
编辑
private static Timer SetTimer()
{
_timer = new Timer(2000.0);
_timer.Elapsed += (sender, args) =>
{
lock (Lock)
{
DoBackgroundStuff();
}
};
lock (Lock)
{
_timer.Enabled = true;
}
return _timer;
}