0

我有许多后台线程(在本例中为 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函数读取excel文件并使用

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

 }

我希望使用 excel 中的行数创建和更新 5 个标签,但没有任何反应。标签未更新但已创建。(甚至在另一个上)。

4

1 回答 1

1

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

编辑:

而不是“this.Invoke(adl);” 尝试“返回(this.Invoke(adl)作为标签);” 并删除“return new Label();” 陈述。

于 2013-08-08T11:26:59.653 回答