我有一个非常简单的控制台应用程序,它会在每2秒钟后触发Timer.Elapsed。控制台应用程序退出,但我仍然在任务浏览器中看到我的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;
}
我发现它正在使用Console.vshost.exe让我困惑。
答案 0 :(得分:1)
您初始化的计时器会以某种方式保持您的程序活着。 为此你需要处理它。
例如:
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;
}