在表单中创建标签并从后台线程更新它们

时间:2013-08-08 11:14:31

标签: c# multithreading winforms

我有许多后台线程(在本例中为5),它们的生成类似于下面的代码:

 Progress prog = new Progress();
 foreach (var questionLang in QuestionsLangConstants.questionLangs.Values)
 {
  ThreadPool.QueueUserWorkItem(
   delegate
   {
    qrepo.UploadQuestions(QWorkBook.Worksheets[questionLang.QSheet], questionLang, prog);
   });
 }
 prog.Show();

Progress是一个包含以下代码的表单。

private delegate Label AddNewLabel();
private delegate void ChangeLabelText(Label lbl, string text);


    public Label addNewLabel()
    {
        if (this.InvokeRequired)
        {
            AddNewLabel adl = new AddNewLabel(addNewLabel);
            this.Invoke(adl);
            return new Label();
        }
        else
        {
            Label lbl = new Label();

            this.Controls.Add(lbl);
            return lbl;
        }
    }

    public void changeLabelText(Label lbl, string text)
    {
        if (this.InvokeRequired)
        {
            ChangeLabelText clt = new ChangeLabelText(changeLabelText);
            this.Invoke(clt, new object[] { lbl, text });

        }
        else
        {

            lbl.Text = text;

        }
    }

UploadQuestions函数读取和退出文件并使用

 Label lbl = prog.addNewLabel();
 while (questionNum != "")
 {
    //code here
    prog.changeLabelText(lbl, questionNum);
   //code to increment questionNum

 }

我希望可以创建5个标签并使用excel中的行数进行更新,但没有任何反应。标签不会更新,但会被创建。 (甚至在另一方面)。

1 个答案:

答案 0 :(得分:1)

我认为在调用委托之后,在if语句中使用此方法“public Label addNewLabel()”,您将返回一个新标签,而不是在else语句中创建的原始标签。不太确定这是否是问题。

编辑:

而不是“this.Invoke(adl);”尝试“return(this.Invoke(adl)as Label);”并删除“return new Label();”言。