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