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