C# 自动打开新窗口而不使用计时器WPF

C# 自动打开新窗口而不使用计时器WPF,c#,wpf,timer,C#,Wpf,Timer,我在一些问题上需要帮助。在主窗口WPF中,我从设备读取状态,0为正常工作,1为其他状态。我想在状态为1时打开新窗口,在状态为0时关闭它。我试着用定时器和showDialog来做。新窗口已创建,但在手动关闭新窗口之前,主窗口中的状态不会更改。有没有建议不用定时器怎么做?也许是一些样品 提前谢谢 主窗口-计时器刻度: public void t1_Tick(Object Sender, EventArgs e) { HttpWebRequest request7 = WebRequest.C

我在一些问题上需要帮助。在主窗口WPF中,我从设备读取状态,0为正常工作,1为其他状态。我想在状态为1时打开新窗口,在状态为0时关闭它。我试着用定时器和showDialog来做。新窗口已创建,但在手动关闭新窗口之前,主窗口中的状态不会更改。有没有建议不用定时器怎么做?也许是一些样品

提前谢谢

主窗口-计时器刻度:

public void t1_Tick(Object Sender, EventArgs e)
{
    HttpWebRequest request7 = WebRequest.Create("http://localhost:8080/datasnap/rest/TAutomatServerMethods/uCard") as HttpWebRequest;

    using (HttpWebResponse response7 = request7.GetResponse() as HttpWebResponse)
    {

        StreamReader reader7 = new StreamReader(response7.GetResponseStream());

        string json7 = reader7.ReadToEnd();

        //  MessageBox.Show(json);

        JObject o7 = JObject.Parse(json7);
        int status_int = Convert.ToInt32(o7["result"][0]);

        if (status_int == 1)
        {
            uCard uc1 = new uCard();
            uc1.ShowDialog();
        }
}
窗口1-关闭窗口

public void t1_Tick(Object Sender, EventArgs e)
{

    if (MainWindow.status_int == 0 )
    {
        this.Close();
    }
}  

首先,您需要创建一个在值更改时引发的事件:

public event Action<int> StatusChanged;
去掉计时器中的status int检查,只需设置变量:

Status = retrieved_status;
报名参加活动:

public MainWindow()
{
    StatusChanged += HandleStatusChange;
}
和ShowDialog来传递表单的实际实例:

private void HandleStatusChange(int newValue)
{
    if (newValue == 1)
    {
       //Threaded so we don't hang the timer callback
       new Thread(() =>
       {
          uCard uc1 = new uCard(this);
          uc1.ShowDialog();
       }).Start();
    }
}
然后在弹出窗口中,您的构造函数将是:

public uCard(MainWindow window)
{
    window.StatusChanged += CheckForClose;
}
您将摆脱计时器,并拥有:

private void CheckForClose(int newValue)
{
    if (newValue == 0 )
    {
      this.Close();
    }
}

它仍然很糟糕,但是更干净,更易于维护。更重要的是,它确实会工作。

为什么这里有计时器?这是用来检查变量的吗?我觉得有些代码丢失了。主窗口中的什么状态没有更改?顺便说一句ShowDialog将阻止执行线程,直到它关闭。这就是为什么,因为我不知道如何在没有计时器的情况下执行。是,window1中的计时器检查mainwindow中的状态。我同意需要更多上下文。关于ShowDialog的澄清:它本身并不阻止线程。窗口消息仍然被压缩,UI仍然可以绘制。这些是在ShowDialog方法的上下文中发生的事情。但被阻止的是调用方法的执行;这个方法在ShowDialog方法返回之前,t1_Tick不会返回,甚至不会进一步执行,而在对话框窗口关闭之前,这种情况不会发生。由哪个函数更新?是什么导致该函数执行?您确定它能够在显示其他窗口时执行吗?你所说的状态是什么意思?_int在同一个计时器方法中。。。?对我来说,这意味着它是一个局部变量。但是如果它是一个局部变量,那么您希望另一个线程如何检查它呢?最后,如果它不是一个局部变量,而是在线程之间真正共享的,您是否将其标记为volatile以确保执行的代码始终看到当前值?请注意,如果您发布了足够多的代码,所有这些问题都不需要回答。@user3455769:无意冒犯,但该回答并没有回答我实际提出的任何问题:感谢@BradleyDotNET:在uCard窗口中,我得到:PresentationCore.dll中发生了“System.InvalidOperationException”类型的未处理异常。调用线程必须是STA,因为许多UI组件需要this@user3455769然后将其标记为其抱怨的线程。我不知道为什么这一切都需要是STA,但它不会伤害你。好的。现在一切正常。再次感谢BradleyDotNET。
private void CheckForClose(int newValue)
{
    if (newValue == 0 )
    {
      this.Close();
    }
}