如何报告多个值

本文关键字:报告 何报告 | 更新日期: 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文档