Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 委托/操作未传递值_C#_Callback_Delegates - Fatal编程技术网

C# 委托/操作未传递值

C# 委托/操作未传递值,c#,callback,delegates,C#,Callback,Delegates,我对使用这种技术有一个非常基本的了解,所以我可能会忽略一些简单的东西。我所要做的就是添加一个包含所有项目的变量,但是当我检查它时,该变量似乎被初始化回0。我最好的猜测是有些东西超出了范围,我正在失去价值 我调用传递委托(?)的函数 在函数内部,我想传回一个值 public static void UpdateBoxes(EncompassConnection ec, DataTable dt, Action<ProgressInfo> updateProgress) {

我对使用这种技术有一个非常基本的了解,所以我可能会忽略一些简单的东西。我所要做的就是添加一个包含所有项目的变量,但是当我检查它时,该变量似乎被初始化回0。我最好的猜测是有些东西超出了范围,我正在失去价值

  • 我调用传递委托(?)的函数

  • 在函数内部,我想传回一个值

     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));
    
  • 现在当它转到回调时,值是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));
    


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

    看起来您的pi变量没有通过引用传递,因此它永远不会真正得到更新。老实说,在委托函数中更改pi.itemsProcessed++之类的值并不常见,尽管有很多方法可以做到这一点

    一旦您的代理支持传入带有“ref”关键字的变量,那么您应该能够使用如下内容调用您的代理:

    progess => UpdateProgressBar(ref pi)
    

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

    为什么您认为
    itemsProcessed
    将是
    100
    ?它的初始值为
    0
    ,您将其增量为
    1
    progess=>UpdateProgressBar(pi)
    看起来很奇怪-您能否确认这是您在测试中实际拥有的(显然
    pi
    的值为零,假设它是某种实例/静态的).我忘了提到pi.itemsprocessed在代码中设置为100。但该值永远不会到达代码的末尾,最终为0。Ok看起来起作用了。因此,基本上我是在方法内部设置值,而不是在外部使用我发送的构造函数设置值。updateProgress(newProgressInfo(2,dt.Rows.Count));。我不太确定Proges=>UpdateProgressBar(pi)在做什么,因为我还不能理解Func/Action/Delegates
    EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));
    
    EncompassBoxHelper.UpdateBoxes(ec, dt, UpdateProgressBar);
    
    progess => UpdateProgressBar(ref pi)