如何报告多个值
本文关键字:报告 何报告 | 更新日期: 2023-09-27 18:11:39
我试图在单个DoWork中发送一个数组,但在ReportProgress中,没有办法接收一个数组,我不确定我应该怎么做才能传递一个数组,如果有人有任何想法,我真的很感激。
这就是我要做的:
public void backgroundWorkerXY_DoWork(object sender, DoWorkEventArgs e)
{
do
{
X = -(RSSI_PI1_ST1);
Y = -(RSSI_PI1_ST1) + 5;
backgroundWorkerX.ReportProgress(X,Y); // pass X and Y
Thread.Sleep(50);
} while (true);
}
然后这里传递这两个值来改变图像的位置:
public void backgroundWorkerXY_ProgressChanged(object sender, object sender1, ProgressChangedEventArgs e)
{
pictureBox1.Location = new Point((int.Parse(e.ProgressPercentage.ToString())), (int.Parse(e.ProgressPercentage.ToString())) );
// Not sure how to let a single ProgressChanged to send two values here
}
有一种替代方法是将它们分开,例如,传递X和传递Y,但要更改图像的位置,值必须是一个包含2个值的点(到目前为止我发现的可能不正确),所以我假设它必须在单个ProgressChanged中,
这是我也尝试过的
pictureBox1.Location.X = new Point((int.Parse(e.ProgressPercentage.ToString())));
不管它怎么说"CS1612无法修改'Control '的返回值。位置',因为它不是一个变量"
我想做的是改变X和Y的位置,我非常欢迎任何替代解决方案,非常感谢任何想法或想法!
ReportProgress接受第二个参数为object
。您可以使用它来返回自定义数据类型,也可以简单地使用Tuple。
public void backgroundWorkerXY_DoWork(object sender, DoWorkEventArgs e)
{
do
{
X = -(RSSI_PI1_ST1);
Y = -(RSSI_PI1_ST1) + 5;
backgroundWorkerX.ReportProgress(50, new Tuple<int, int>(X,Y));
Thread.Sleep(50);
} while (true);
}
UserState
将传递给ProgressChanged
事件参数
public void backgroundWorkerXY_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var args = (Tuple<int, int>)e.UserState;
pictureBox1.Location = new Point(args.Item1, args.Item2) );
}
ReportProgress
有一个接受任何对象的过载,你可以使用它。
worker.ReportProgress( someProgressPercentage, new Point(x,y));
private void backgroundWorkerXY_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var point = (Point)e.UserState;
pictureBox1.Location = point;
}
你可以传递一个自定义类,例如
public class MyCustomClass
{
public int X {get;set;}
public int Y {get;set;}
}
然后像这样使用:
public void backgroundWorkerXY_DoWork(object sender, DoWorkEventArgs e)
{
do
{
backgroundWorkerX.ReportProgress(
0,
new MyCustomClass
{
X = -(RSSI_PI1_ST1),
Y = -(RSSI_PI1_ST1) + 5
} );
Thread.Sleep(50);
} while (true);
}
并像这样消费:
public void backgroundWorkerXY_ProgressChanged(
object sender,
ProgressChangedEventArgs e)
{
var my = (MyCustomClass)e.UserState;
pictureBox1.Location = new Point(my.X, my.Y);
}
参考:
-
ReportProgress
方法overload的MSDN文档 -
ProgressChanged
事件MSDN文档