0

嘿,我正试图让我的后台工作人员在我的表单更改时将参数发送回主线程..

在后台工作人员运行的方法中,我有这个

worker.ReportProgress(p);

p 是正在运行的 for 循环中的变量

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

我试图让这个标签文本在后台工作人员通过循环时更改为 p 。

谢谢你的帮助!!:)

4

4 回答 4

3

ReportProgress有两个参数:

  1. 进度百分比(整数)
  2. 用户状态(对象)

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

worker.ReportProgress(0, p);

或者您可以使用单个参数重载并发送进度百分比。

在您的处理程序中ProgressChangedEventArgs,您必须使用几个属性。要获取进度百分比值,您可以将其访问为

myPercentLabel.Text = e.ProgressPercentage.ToString;

要获取您的用户数据(p),您必须以以下方式访问它:

label6.Text = e.UserState.ToString;

要发送更复杂的数据,您可以在 UserState 中发送任何类型的对象或结构,只要您在处理程序中正确地转换它即可。在任何一种情况下,您都必须访问ProgressPercentage UserState属性e

于 2012-06-21T19:05:45.500 回答
1

您可能会遇到一些问题。首先,如果您在后台工作程序中的循环相对较快,则该值可能会更改得太快,以至于您的标签无法跟上。其次,标签不一定会在每次设置文本时立即刷新,因此可能会跳过一些值。最后,我相信你真正想要的是 e.UserState.ToString() 而不仅仅是 e.ToString();

于 2012-06-21T19:02:04.657 回答
1

你必须通过

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

然后使用

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

代替

label6.Text = e.ToString();
于 2012-06-21T19:05:17.413 回答
0

我知道了!

做过这个...

    label6.Text = e.UserState.ToString();
于 2012-06-21T19:07:46.920 回答