C# System.Threading.Timer的处理方法不适用于ManualResetEventSlim?

C# System.Threading.Timer的处理方法不适用于ManualResetEventSlim?,c#,windows-services,timer,manualresetevent,C#,Windows Services,Timer,Manualresetevent,我有以下用于模拟Windows服务的示例控制台应用程序的代码 class Program { private Timer timer; private object syncRoot = new object(); private bool stopSignalled = false; private ManualResetEventSlim mre = new ManualResetEventSlim(false); static void Main(s

我有以下用于模拟Windows服务的示例控制台应用程序的代码

class Program
{
    private Timer timer;
    private object syncRoot = new object();
    private bool stopSignalled = false;
    private ManualResetEventSlim mre = new ManualResetEventSlim(false);
    static void Main(string[] args)
    {
        Program p = new Program();
        p.Start();
        Console.ReadLine();
        p.Stop();
        Console.WriteLine("Stopped at:{0:G}", DateTime.Now);
    }

    private void Stop()
    {
        stopSignalled = true;
        mre.Wait();            

    }
    private void Timercallback(object state)
    {
        lock (syncRoot)
        {
            if (!stopSignalled)
            {
                 Console.WriteLine("Callback invoked  at:{0:G}",DateTime.Now);

            }
            else
            {
                timer.Dispose(mre.WaitHandle);
                Console.WriteLine("Timer disposed at:{0:G}", DateTime.Now);
            }
        }

    }

    private void Start()
    {
        Console.WriteLine("Started at:{0:G}",DateTime.Now);
        timer = new Timer(Timercallback,null,TimeSpan.Zero,TimeSpan.FromSeconds(1));

    }
}
我感到惊讶的是,接受WaitHandle的Dispose重载在使用ManualResetEventSlim时从未向句柄发出信号。 如果我将代码更改为像这样使用ManualResetEvent,那么句柄确实会收到信号

    class Program
{
    private Timer timer;
    private object syncRoot = new object();
    private bool stopSignalled = false;
    private ManualResetEvent mre = new ManualResetEvent(false);
    static void Main(string[] args)
    {
        Program p = new Program();
        p.Start();
        Console.ReadLine();
        p.Stop();
        Console.WriteLine("Stopped at:{0:G}", DateTime.Now);
    }

    private void Stop()
    {
        stopSignalled = true;
        mre.WaitOne();            

    }
    private void Timercallback(object state)
    {
        lock (syncRoot)
        {
            if (!stopSignalled)
            {
                 Console.WriteLine("Callback invoked  at:{0:G}",DateTime.Now);

            }
            else
            {
                timer.Dispose(mre);
                Console.WriteLine("Timer disposed at:{0:G}", DateTime.Now);
            }
        }

    }

    private void Start()
    {
        Console.WriteLine("Started at:{0:G}",DateTime.Now);
        timer = new Timer(Timercallback,null,TimeSpan.Zero,TimeSpan.FromSeconds(1));

    }
}

什么给你

是否已检查Dispose方法的返回值?接受等待句柄的Dispose返回true/false,指示成功/失败。无论返回值如何,Dispose都应在某个点向句柄发出信号。你从来没有检查过Dispose方法的返回值吗?接受等待句柄的Dispose返回true/false,指示成功/失败。无论返回值如何,Dispose都应在某个点向句柄发出信号。从来没有