Delegate/Action 没有传值

Delegate/Action is not passing value

我对使用这种技术有非常基本的了解,所以我可能遗漏了一些简单的东西。我想要做的就是添加一个变量来保存 TOTAL 项,但是当我检查它时,该变量似乎被初始化回 0。我最好的猜测是有些事情超出了范围,我失去了价值。

  1. 我调用了一个传递委托的函数(?)

    [TestMethod]
    public void Batch_Update_Is_Working()
    {
        DataTable dt = ExcelHelper.ReadAsDataTable(pathFileName);
       EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));
    }
    
  2. 在函数内部我想传回一个值。

     public static void UpdateBoxes(EncompassConnection ec, DataTable dt, Action<ProgressInfo> updateProgress)
     {
        Session s = EncompassSession.Instance(ec.Url, ec.Name, ec.Password);
    
        updateProgress(new ProgressInfo(dt.Rows.Count));
    
  3. 这是存储值的地方。在 ItemsTotal 中。目前一切顺利。

     public class ProgressInfo
     {
         public int itemsProcessed { get; set; }
         public int itemsTotal { get; set; }
    
         public ProgressInfo()
         {
    
         }
    
         public ProgressInfo(int it)
        {
            itemsTotal = it;
        }
    }
    
  4. 现在回调的时候值为0??? pi.itemsProcessed 假设为 100。

    public void UpdateProgressBar(ProgressInfo pi)
    {
        pi.itemsProcessed++;
        Debug.WriteLine("Progress Info.ItemsProcessed: " + pi.itemsProcessed);
        Debug.WriteLine("Progress Info.ItemsTotal: " + pi.itemsTotal);
    
    }
    

改变你的

EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));

EncompassBoxHelper.UpdateBoxes(ec, dt, UpdateProgressBar);

您不是发送 UpdateProgressBar() 方法来匹配 UpdateBoxes 参数中预期的委托,而是通过转换 lambda 表达式创建一个新委托,告诉它使用参数专门调用自身pi,而不是应该在 UpdateBoxes 方法(new ProgressInfo(dt.Rows.Count) 对象)中传递的那个。

看起来你的 pi 变量没有通过引用传递,所以它永远不会真正更新。老实说,在你的委托函数中改变像 pi.itemsProcessed++ 这样的值并不是很常见,尽管有很多方法可以做到 like this.

一旦您的委托支持使用 "ref" 关键字传入变量,那么您应该可以使用如下方式调用您的委托:

progess => UpdateProgressBar(ref pi)

您也可以将 pi 设为静态变量,然后它也可以从您的委托中更新,这样您就不必担心传递它了。