如何在C#backgroundworker中发送更多参数改进了事件

时间:2011-09-07 10:52:17

标签: c# events backgroundworker

我理解如何将一个变量(progresspercentage)传递给“progresschanged”函数,就像这样。

backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

...

worker.ReportProgress(pc);

...

private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
   this.progressBar1.Value = e.ProgressPercentage;
}

但是我想把更多变量传递给这个函数,有些东西像:

worker.ReportProgress(pc,username,score);

...

private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
   this.progressBar1.Value = e.ProgressPercentage;
   this.currentUser.Value = e.UserName;  //as string
   this.score.Value = e.UserScore;  //as int
}
抱歉,我是c#的新手,有人可以给我一个例子。

3 个答案:

答案 0 :(得分:20)

后台工作程序组件的ReportProgress方法被重载以传递百分比和对象类型状态值:

public void ReportProgress(int percentProgress, Object userState)

在您的使用要求中,您可以使用char分隔符连接UserName和Score,因此在userState参数中传递多个值;并在引发它时将它们拆分在ProgressChanged()事件中。您还可以创建一个基于小属性的类 - 用值填充它并使用userState对象类型参数传递。

有关如何使用重载的ReportProgress方法的示例示例,请查看以下MSDN链接:

http://msdn.microsoft.com/en-us/library/a3zbdb1t.aspx

答案 1 :(得分:14)

如果有人在寻找全面的答案:

  1. 快速&简单的方法是object[],如:

    worker.ReportProgress(i, new object[] { pc, username, score });
    
  2. 快速&amp;类型安全的方法是System.Tuple<>,如:

    worker.ReportProgress(i, new System.Tuple<object, string, float>(pc, username, score));
    
  3. 最佳做法是编写自定义类(或者可能继承自System.Tuple<>)。

    public class PcUsernameScore
    {
        public object PC;
        public string UserName;
        public float Score;
        public PcUsernameScore(object pc, string username, float score)
        {
            PC = pc; Username = username; Score = score;
        }
    }
    

    public class PcUsernameScore : System.Tuple<object, string, float>
    {
        public PcUsernameScore(object p1, string p2, float p3) : base(p1, p2, p3) { }
    }
    

    有类似的东西:

    worker.ReportProgress(i, new PcUsernameScore(pc, username, score));
    
  4. - C#7.1

    1. 推断元组功能:

      worker.ReportProgress(i, (pc: "pc", username: "me", score: 0));

答案 2 :(得分:7)

创建一个数据传输对象,其中包含要传递的项的属性,然后将其作为用户状态传递。在OO世界中,答案几乎总是创建另一个对象。