2012-06-21 42 views
0

嘿,我试图让我的背景工人送参数回主线程在我的表格时,它改变..C#Visual Studio 2010的后台工作,报告进度

在该方法中的后台工作运行我有这个

worker.ReportProgress(p); 

p是运行

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     label6.Text = e.ToString(); 
    } 

我试图让这个标签文本变更为p为背景的作品在一个for循环变量呃经历循环。

感谢您的任何帮助! :)

回答

3

ReportProgress有两个参数:

  1. ProgressPercentage(整数)
  2. UserState(对象)

如果你不关心进度百分比,您可以发送0,而不是使用它:

worker.ReportProgress(0, p); 

或者你也可以使用单参数超载和只有发送进度百分比。

在您的处理程序中,ProgressChangedEventArgs有几个属性需要使用。要获取进度百分比值,那么你访问它作为

myPercentLabel.Text = e.ProgressPercentage.ToString; 

,让您的用户数据(p),你需要访问它:

label6.Text = e.UserState.ToString; 

要发送更复杂的数据,您可以发送任何类型的对象或结构在UserState中,只要你在处理程序中正确转换它。在任何情况下,您必须访问eProgressPercentageUserState财产。

+0

谢谢我自己也明白了! –

1

你很可能遇到这个问题。首先,如果您的后台工作人员的循环速度相对较快,那么值可能会变得太快,以致您的标签无法跟上。其次,每次设置文本时,标签可能不一定立即刷新,因此可能会跳过某些值。最后,我相信你真正想要的是e.UserState.ToString()而不仅仅是e.ToString();

1

你必须通过

worker.ReportProgress((int)(p*100.0/loopMaxValue)); 

然后用

label6.Text = e.ProgressPercentage.ToString(); 

,而不是

label6.Text = e.ToString(); 
0

我明白了!

做到了这一点......

label6.Text = e.UserState.ToString();