在表单中添加轮询功能的位置?

时间:2013-11-15 21:53:07

标签: c# multithreading function

使用C#,Visual Studio 2010,Windows 7 ....

我有一张OvalShape的表单。我想将此函数添加到表单线程或创建一个后台线程来检查服务的状态,并像交通信号灯一样更改OvalShape的颜色。

private void ServiceStatus()
{
  if (ServiceManagement.ServiceStatus("OracleServiceXE"))
     ovalshape.BackColor =Color.Green;
  else
     ovalshape.BackColor = Color.Red;

}

添加此功能的最佳位置在哪里(每1-5秒)执行一次?

2 个答案:

答案 0 :(得分:1)

ServiceManagement.ServiceStatus()是否总是快速返回?如果服务状态为false,那么返回该信息会有延迟吗?

如果是,那么您不希望该行通过Timer在主UI线程中运行,因为它可能会使您的应用无响应。

如果有可能,则可能需要保证辅助线程。 BackgroundWorker()控件可以是一种方法:

public partial class Form1 : Form
{

    private BackgroundWorker bgw = new BackgroundWorker();

    public Form1()
    {
        InitializeComponent();
        bgw.WorkerReportsProgress = true;
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
    }

    private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            if (ServiceManagement.ServiceStatus("OracleServiceXE"))
            {
                bgw.ReportProgress(-1, Color.Green);
            }
            else
            {
                bgw.ReportProgress(-1, Color.Red);
            }
            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5));
        }
    }

    private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ovalshape.BackColor = (Color)e.UserState;
    }

}

答案 1 :(得分:0)

WinForms:将Timer拖到窗体上,将Enabled设置为true,将Interval设置为5000。 双击计时器以添加Tick-Eventhandler。从那里开始运行你的方法。

WPF:

using System.Timers;
Timer serviceStatusTimer = new Timer(5000);
private void OnLoaded(object sender, RoutedEventArgs e) // Window loaded event
{
    serviceStatusTimer.Elapsed += ServiceStatus;
    serviceStatusTimer.Enabled = true;
    serviceStatusTimer.Start();
}