我有许多后台线程(在本例中为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中的行数进行更新,但没有任何反应。标签不会更新,但会被创建。 (甚至在另一方面)。
答案 0 :(得分:1)
我认为在调用委托之后,在if语句中使用此方法“public Label addNewLabel()”,您将返回一个新标签,而不是在else语句中创建的原始标签。不太确定这是否是问题。
编辑:
而不是“this.Invoke(adl);”尝试“return(this.Invoke(adl)as Label);”并删除“return new Label();”言。