C # Обновление пользовательского интерфейса в Windows Forms из фонового потока - PullRequest
2 голосов
/ 28 декабря 2010

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

Я пытаюсь использовать вышеизложенное, и, хотя оно работает в некотором смысле (оно не блокирует мое приложение), к сожалению, оно не обновляет метки в пользовательском интерфейсе. Я что-то не так делаю? У меня есть две метки, которые находятся на 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       ";
    }

Спасибо за любую помощь, я новичок в потоках и могу использовать некоторые знания, и, верьте или нет, я искал везде, пытаясь выяснить, где я иду не так, как надо.

1 Ответ

8 голосов
/ 28 декабря 2010

Вы создали объект потока, но не запускаете его, поскольку ваш код выглядит так:

bottomLabelsThread.Start();

Он не запускается автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...