从BackgroundWorker C#更改控件的属性
我正在尝试从目录中加载一堆文件,并在加载时显示进度条状态,以及显示正在处理哪个文件的标签。
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的文本?
正如C. Ross所说 ,您可以使用Control.Invoke方法系列直接执行此操作,但通过处理BackgroundWorker.ProgressChanged事件间接执行此操作可能更容易 – 并且可能更为惯用。 在后台线程上引发DoWork时,会在UI线程上引发ProgressChanged。 因此,在ProgressChanged中更新文本不需要调用。
此外,这可以使您的工作者function不受UI依赖性的影响,从而使测试更容易。
您需要使用InvokeRequired和BeginInvoke 。
此页面告诉您如何执行此操作。 这是MSDN页面 。
- BackgroundWorker – 在RunWorkerCompleted中CancellationPending更改为false。 为什么?
- BackgroundWorker有匿名方法吗?
- 在Winforms的背景工作者装货屏幕
- 同步调用BackgroundWorker
- 在BackgroundWorker和主线程之间共享对象
- 后台工人类取消,设置取消挂起标志但不退出
- BackgroundWorker OnWorkCompleted抛出跨线程exception
- 不是.NET 4.0 TPL使APM,EAP和BackgroundWorker异步模式过时了吗?
- C#后台工作者在DoWork中设置e.Result并在WorkCompleted中获取值