如何在C#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#的新手,有人可以举个例子。
后台工作程序组件的ReportProgress方法被重载以传递百分比和对象类型状态值:
public void ReportProgress(int percentProgress, Object userState)
在您的使用要求中,您可以使用char分隔符连接UserName和Score,因此在userState参数内传递多个值; 并在引发它时将它们拆分到ProgressChanged()事件中。 您还可以创建一个基于小属性的类 – 用值填充它并使用userState对象类型参数传递。
有关如何使用重载的ReportProgress方法的示例示例,请查看以下MSDN链接:
如果有人正在寻找一个全面的答案:
-
快速简单的方法是
object[]
如:worker.ReportProgress(i, new object[] { pc, username, score });
-
快速和类型安全的方法是
System.Tuple<>
如:worker.ReportProgress(i, new System.Tuple
-
最佳做法是编写自定义类 (或者可能从
System.Tuple<>
inheritance)。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
有类似的东西:
worker.ReportProgress(i, new PcUsernameScore(pc, username, score));
创建一个数据传输对象,其中包含要传递的项的属性,然后将其作为用户状态传递。 在OO世界中,答案几乎总是创造另一个对象。