C#从后台线程更新Windows窗体中的UI

COD*_*ODe 2 c# multithreading winforms

http://www.codeproject.com/KB/threads/winformsthreading.aspx

我试图使用上面的内容,虽然它在某种意义上起作用(它没有锁定我的应用程序),但它不会更新UI上的标签.我在某个地方出错了吗?我在MainForm,expiredPoliciesLabel和missingPoliciesLabel上有两个标签.要更新它们,我必须通过执行一系列数据库查询来设置expiredPoliciesNum和missingPoliciesNum,如您所见.我需要标签每分钟左右自动更新.(我现在知道我将它设置为1秒,只是看代码是否正常工作)

这是我的代码.

public delegate void updatePolicyLabelsDelegate();

public partial class MainForm: Form
{
    SQLiteQuery sqliteQuery = new SQLiteQuery(Properties.Settings.Default.DatabasePath);
    int expiredPoliciesNum = 0;
    int missingPoliciesNum = 0;
    Thread minimizeThread;

    public MainForm()
    {
        this.Resize += new EventHandler(MainForm_Resize);
        this.IsMdiContainer = true;
        InitializeComponent();
        this.ShowInTaskbar = false;

        keyValidation();

        Thread bottomLabelsThread = new Thread(new ThreadStart(updateLabels));
        bottomLabelsThread.IsBackground = true;
    }

    public void updateLabels()
    {
        while (true)
        {
            Invoke(new updatePolicyLabelsDelegate(updatePolicyLabels));
            Thread.Sleep(1000);
        }
    }

    private void updatePolicyLabels()
    {
        DataTable dt = sqliteQuery.selectFromDatabase("*", "WHERE GLOPolicy != '1'");
        missingPoliciesNum = dt.Rows.Count;

        dt = sqliteQuery.selectFromDatabase("*", "WHERE ALPolicy != '1'");
        missingPoliciesNum = missingPoliciesNum + dt.Rows.Count;

        dt = sqliteQuery.selectFromDatabase("*", "WHERE WCPolicy != '1'");
        missingPoliciesNum = missingPoliciesNum + dt.Rows.Count;

        dt = sqliteQuery.selectFromDatabase("*", "WHERE ULPolicy != '1'");
        missingPoliciesNum = missingPoliciesNum + dt.Rows.Count;

        String now = DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day;

        dt = sqliteQuery.selectFromDatabase("*", "WHERE GLOPolicy = '1' AND GLOExpiration < '" + now + "'");
        expiredPoliciesNum = dt.Rows.Count;

        dt = sqliteQuery.selectFromDatabase("*", "WHERE ALPolicy = '1' AND ALExpiration < '" + now + "'");
        expiredPoliciesNum = expiredPoliciesNum + dt.Rows.Count;

        dt = sqliteQuery.selectFromDatabase("*", "WHERE WCPolicy = '1' AND WCExpiration < '" + now + "'");
        expiredPoliciesNum = expiredPoliciesNum + dt.Rows.Count;

        dt = sqliteQuery.selectFromDatabase("*", "WHERE ULPolicy = '1' AND ULExpiration < '" + now + "'");
        expiredPoliciesNum = expiredPoliciesNum + dt.Rows.Count;


        expiredPoliciesLabel.Text = expiredPoliciesNum + " Expired Policies       ";
        missingPoliciesLabel.Text = missingPoliciesNum + " Missing Policies       ";
    }
Run Code Online (Sandbox Code Playgroud)

感谢任何帮助,我是线程新手,可以使用一些专业知识,不管你信不信,我到处搜索试图找出我出错的地方无济于事.

小智 8

您创建了线程对象,但是没有启动它,因为您的代码似乎显示:

bottomLabelsThread.Start();
Run Code Online (Sandbox Code Playgroud)

它不是自动启动的.