4

我在我的 Windows 应用程序中使用了 SystemEvents.TimeChanged 事件,它触发了两次。我使用的代码:

using System;
using Microsoft.Win32;

namespace DateTimeTests
{
    class Program
    {
        static void Main(string[] args)
        {
            SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged);
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }

        static void SystemEvents_TimeChanged(object sender, EventArgs e)
        {
            Console.WriteLine("Time changed: {0}", DateTime.Now);
        }
    }
}

我试图更改 Windows 中的时间,并且事件发生了两次。为什么?

4

4 回答 4

4

这是无法修复的 MS 错误

http://connect.microsoft.com/VisualStudio/feedback/details/776003/systemevent-timechanged-is-fired-twice

于 2014-03-07T05:14:20.750 回答
3

SystemEvents.TimeChanged手动设置时钟时确实会发生令人讨厌的双重触发。当您将日期和时间设置从手动 -> 自动切换时也会发生这种情况(假设因此调整了时钟):

在此处输入图像描述

所以是的,这似乎是一个 Windows 问题。有一个简单的方法:使用响应式扩展来包装SystemEvents.TimeChanged事件并忽略无关事件的发生。

1)System.Reactive从 Nuget 安装 2) 使用类似于以下的代码:

using Microsoft.Win32;
using System;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            IDisposable subscriptionToken = 
                Observable.FromEventPattern(e => SystemEvents.TimeChanged += e, e => SystemEvents.TimeChanged -= e)
                .Select(x => new Unit())
                .Throttle(TimeSpan.FromMilliseconds(250))
                .Subscribe(x => Console.WriteLine("The system clock just changed"));

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();

            subscriptionToken.Dispose();
        }
    }
}

即使在 250 毫秒的时间范围内触发了两个以上的事件,这也将起作用;只有最后一个会被执行

于 2018-12-18T19:33:56.900 回答
0

只需在第一次触发此事件时取消链接即可解决问题:

static void SystemEvents_TimeChanged(object sender, EventArgs e)
{
    SystemEvents.TimeChanged -= new EventHandler(SystemEvents_TimeChanged);

    Console.WriteLine("Time changed: {0}", DateTime.Now);
}
于 2015-03-02T13:46:44.333 回答
0

它只是在收到WM_TIMECHANGE 消息时触发事件。因此,您需要寻找另一个程序两次更改时间的原因,或者可能过于热心地更改系统时间广播此消息。很难推测,因为你没有描述你做了什么来改变时间。

当然,这绝不应该是一个真正的问题。

于 2013-02-24T14:40:14.547 回答