C# 为什么这段代码在由计时器执行时不工作,但在其他地方调用时工作良好?

C# 为什么这段代码在由计时器执行时不工作,但在其他地方调用时工作良好?,c#,wpf,C#,Wpf,我正在使用数据供应商提供的API将数据拉入C/WPF应用程序。我有良好的工作和数据连接拉。我定期进行检查以验证连接是否已丢失,如果发生这种情况,请重新连接。该检查由计时器执行,但由于某种原因它不起作用,即使它是在我的应用程序中被调用并在其他任何地方起作用的同一代码 我认为这与这样一个事实有关,即有一个单例实例,计时器是一个单独的线程。但我不知道如何修复它 它在InitializeComponent之后被调用 public void OpenConnections() { DataServ

我正在使用数据供应商提供的API将数据拉入C/WPF应用程序。我有良好的工作和数据连接拉。我定期进行检查以验证连接是否已丢失,如果发生这种情况,请重新连接。该检查由计时器执行,但由于某种原因它不起作用,即使它是在我的应用程序中被调用并在其他任何地方起作用的同一代码

我认为这与这样一个事实有关,即有一个单例实例,计时器是一个单独的线程。但我不知道如何修复它

它在InitializeComponent之后被调用

public void OpenConnections()
{
    DataServices.Instance.StateChanged += OnStateChanged;
    DataServices.Instance.Initialize(AppName);
    _timeSeries = DataServices.Instance.TimeSeries;
    _timeSeries.ServiceInformationChanged += 
    timeSeries_ServiceInformationChanged;
}
OnStateChanged和timeSeries\u ServiceInformationChanged事件处理程序只更新UI以向用户显示连接状态

在启动时调用这4行代码,或者通过重新连接按钮或类似的方式从UI调用这4行代码时,这4行代码可以正常工作,但不能通过经过计时器事件,即使我使用了lock关键字:

private static readonly object padlock = new object();

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    if (DataServices.Instance.State == DataServicesState.Up && 
        _timeSeries.ServiceInformation.State == ServiceState.Up)
    {
        //do nothing, services are up and connected.
    }
    else
    {
        lock(padlock)
        {
            OpenConnections();
        }
    }
}
编辑:

这是请求的计时器代码

System.Timers.Timer ConnectionCheckerTimer;


private void InitializeConnectionCheckerTimer()
{
    ConnectionCheckerTimer = new System.Timers.Timer(5000);
    ConnectionCheckerTimer.Elapsed += OnTimedEvent;
    ConnectionCheckerTimer.AutoReset = true;
    ConnectionCheckerTimer.Enabled = true;
}
initializeConnectionCheckTimer在initializeComponent之后调用

public void OpenConnections()
{
    DataServices.Instance.StateChanged += OnStateChanged;
    DataServices.Instance.Initialize(AppName);
    _timeSeries = DataServices.Instance.TimeSeries;
    _timeSeries.ServiceInformationChanged += 
    timeSeries_ServiceInformationChanged;
}
编辑2 我让它工作了。该问题是线程问题,API将仅从创建它的UI线程进行连接。我不知道为什么会这样,但解决的办法是通过手动调用,直接从UI线程调用我们想要的代码,如下所示

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    if (DataServices.Instance.State == DataServicesState.Up && 
        _timeSeries.ServiceInformation.State == ServiceState.Up)
    {

    }
    else
    {
        Application.Current.Dispatcher.Invoke(
            () =>
            {
                OpenConnections();
            });
    }
}

我能够通过手动调用UI线程的调度程序并从那里执行代码来让它工作

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    if (DataServices.Instance.State == DataServicesState.Up && _timeSeries.ServiceInformation.State == ServiceState.Up)
    {

    }
    else
    {
        Application.Current.Dispatcher.Invoke(
            () =>
            {
                OpenConnections();
            });
    }
}

你的计时器代码在哪里?比如,你在哪里举办这个活动?您已显示OnTimeEvent方法,但未显示其配置位置。你能显示代码吗?计时器事件是在gui线程上引发的,还是在其他线程上引发的?我编辑了这个问题以显示计时器代码。我已经通过了调试器,并验证了代码确实如预期的那样被触发。因此,计时器将关闭,事件将触发相应的代码。我无法想象为什么结果会与从UI线程调用时不同。啊,刚刚看到UI线程的注释。也许这不是我最初的建议,那么,什么不起作用呢?什么时候开火?正在调用OpenConnections?那么,有什么不起作用呢?请为站点正确设置代码格式。谢谢。你能澄清一下你的意思吗?我的代码格式是否不正确?我在发帖时遵循了编辑器中的说明。我认为编辑器没有告诉你使用标签。啊,好的。似乎管理员已经删除了它们。我会记住的。是的,就是我。谢谢