System.Timers.Timer线程未退出,停止Console App完成

时间:2014-07-08 09:58:01

标签: c#

我有一个非常简单的控制台应用程序,它会在每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让我困惑。

1 个答案:

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