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混淆了我。

System.Timers.Timer线程未退出,停止控制台应用程序以完成

您初始化的计时器以某种方式保持程序存活。为此,您需要处理它。

例如:

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;
 }