我正在尝试从目录中加载一堆文件,并在加载时显示进度条状态,以及显示正在处理哪个文件的标签。
private void FileWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < Files.Length; i++)
{
Library.AddSong(Files[i]);
FileWorker.ReportProgress(i);
}
}
目前它正确处理所有内容,并且进度条正确显示状态,但是当我尝试更改标签的文本(lblfile.text)时,它表示它无法更改不同线程上的控件。有没有办法从Fileworker更改lblfile.text的文本?
答案 0 :(得分:12)
作为C. Ross says,您可以使用Control.Invoke系列方法直接执行此操作,但通过处理BackgroundWorker.ProgressChanged事件间接执行此操作可能更容易 - 并且可能更为惯用。在后台线程上引发DoWork时,会在UI线程上引发ProgressChanged。因此,在ProgressChanged中更新文本不需要调用。
此外,这可以使您的工作人员功能不受UI依赖关系的影响,从而使测试更容易。
答案 1 :(得分:2)
您需要使用InvokeRequired和BeginInvoke This page告诉您如何操作。 这是MSDN page。