【问题标题】:Timer/Refresh functionality for text box文本框的定时器/刷新功能
【发布时间】:2012-08-10 17:33:10
【问题描述】:

在我的应用程序中,我有两个带有两个标签的文本框:“已连接”和“未连接”。如我的代码所示,如​​果建立了连接,“已连接”文本框将填充绿色,表示网络连接。如果没有,它将是红色的。

连接检测功能运行良好,但是,我必须重新打开应用程序才能检测到更改。我正在寻找一种每隔 5-10 秒左右自动刷新应用程序以检测连接性变化的方法。我不想清除任何其他字段或框的内容,只是清除颜色文本框。可以说是软轮询循环。我将如何使用 Timer 方法执行此操作。我应该创建一个新线程来运行计时器并刷新框吗?

谢谢。

  if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() == false)
        {
            noConnect.Select();  //if not connected, turn box red
            noConnect.BackColor = Color.Red;

        }

        else
        {
            netConnect.Select();  // if connected, turn box green
            netConnect.BackColor = Color.Lime;

        }

        //need to refresh box/application without losing other box/field contents 
        //in order to constantly check connectivity around 5-10 seconds or so
        //constantly check connectivity 

【问题讨论】:

  • @HenkHolterman BackColor 是 winform 而不是 WPF :)
  • 为什么要投票?网络是否不提供“OnConnect”、“OnDisconnect”事件或可覆盖的功能?

标签: c# winforms multithreading timer refresh


【解决方案1】:

这样的事情会起作用

    public Form1()
    {
        InitializeComponent();
        var timer = new Timer();
        timer.Tick += new EventHandler(timer_Tick);
        timer.Interval = 10000; //10 seconds
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        if (your_function_call())
        {
            netConnect.BackColor = Color.Green;
        }
        else
            netConnect.BackColor = Color.Red;
    }

timer_Tick 将在每个间隔重复调用,您可以轮询您的状态和更新控件。因为计时器回调是在 UI 线程中调用的,所以您可以更新任何 UI 元素。

来自Timer Class

计时器用于以用户定义的时间间隔引发事件。这 Windows 计时器专为单线程环境而设计,其中 UI 线程用于执行处理。它需要用户代码 有一个可用的 UI 消息泵,并且总是从同一个操作 线程,或将调用编组到另一个线程。当你使用这个 定时器,使用 Tick 事件执行轮询操作或显示 指定时间段的启动画面。每当启用 属性设置为 true 并且 Interval 属性大于 零,Tick 事件基于 Interval 间隔触发 属性设置。

此解决方案使用System.Windows.Forms.Timer 调用 UI 线程上的刻度。如果您使用System.Timers.Timer,回调将不会在 UI 线程上。

【讨论】:

  • 非常感谢。连接检测现在工作正常!
  • 正在寻找一种简单的方法来更新 textbox 的经过时间,这是最简单的方法 +1
【解决方案2】:

只需创建timer。它很好地在他自己的线程上运行,而无需您做任何其他事情。

【讨论】:

  • 事件在主线程中引发,时间在单独的线程中检查。
  • 不,“时间检查”是作为 MessagePump 的一部分完成的。当它停止时,你的计时器也会停止。
【解决方案3】:

您可以在应用程序的某处创建计时器

var timer = new System.Timers.Timer();
timer.Interval = 5000; // every 5 seconds
timer.Elapsed = (s, e) => {
    // Your code
};
timer.Start();

注意:请注意,您在 Elapsed 事件处理程序中的代码可以/将在另一个线程上运行!

【讨论】:

  • 只需使用Windows.Forms.Timer 即可避免所有线程问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2016-04-30
  • 2012-03-07
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
相关资源
最近更新 更多