【问题标题】:C# visual studio 2010 background worker, report progressC# Visual Studio 2010 后台工作者,报告进度
【发布时间】:2012-06-21 18:57:49
【问题描述】:
嘿,我正试图让我的后台工作人员在我的表单更改时将参数发送回主线程..
在后台工作人员运行的方法中,我有这个
worker.ReportProgress(p);
p 是正在运行的 for 循环中的变量
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label6.Text = e.ToString();
}
我试图让这个标签文本在后台工作人员通过循环时更改为 p。
感谢您的帮助!! :)
【问题讨论】:
标签:
c#
visual-studio-2010
backgroundworker
progress
【解决方案1】:
ReportProgress 接受两个参数:
- 进度百分比(整数)
- 用户状态(对象)
如果您不关心进度百分比,您可以发送0 而不要使用它:
worker.ReportProgress(0, p);
或者您可以使用单个参数重载并且仅发送进度百分比。
在您的处理程序中,ProgressChangedEventArgs 有几个您必须使用的属性。要获取进度百分比值,您可以将其访问为
myPercentLabel.Text = e.ProgressPercentage.ToString;
要获取您的用户数据 (p),您必须以以下方式访问它:
label6.Text = e.UserState.ToString;
要发送更复杂的数据,您可以在 UserState 中发送任何类型的对象或结构,只要您在处理程序中正确转换即可。在任何一种情况下,您都必须访问ProgressPercentage 或 e 的UserState 属性。
【解决方案2】:
您可能会遇到一些问题。首先,如果您在后台工作人员中的循环相对较快,则该值可能会更改得太快,以至于您的标签无法跟上。其次,标签不一定会在每次设置文本时立即刷新,因此可能会跳过某些值。最后,我相信你真正想要的是 e.UserState.ToString() 而不仅仅是 e.ToString();
【解决方案3】:
你必须通过
worker.ReportProgress((int)(p*100.0/loopMaxValue));
然后使用
label6.Text = e.ProgressPercentage.ToString();
而不是
label6.Text = e.ToString();
【解决方案4】:
我明白了!
这样做...
label6.Text = e.UserState.ToString();