我对使用这种技术有一个非常基本的了解,所以我可能会遗漏一些简单的东西。我想要做的就是添加一个包含TOTAL项的变量,但是当我检查它时,变量似乎被初始化为0。我最好的猜测是超出范围,我正在失去价值。
我调用一个传递委托(?)
的函数[TestMethod]
public void Batch_Update_Is_Working()
{
DataTable dt = ExcelHelper.ReadAsDataTable(pathFileName);
EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));
}
在函数内部我想传回一个值。
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));
这是存储值的位置。在ItemsTotal中。到目前为止一切都很好。
public class ProgressInfo
{
public int itemsProcessed { get; set; }
public int itemsTotal { get; set; }
public ProgressInfo()
{
}
public ProgressInfo(int it)
{
itemsTotal = it;
}
}
现在当它进入回调时,值为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);
}
答案 0 :(得分:1)
更改您的
EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));
到
EncompassBoxHelper.UpdateBoxes(ec, dt, UpdateProgressBar);
不是发送UpdateProgressBar()
方法来匹配UpdateBoxes
参数中预期的委托,而是通过转换lambda表达式来创建一个新表达式,告诉它使用参数应该在pi
方法(UpdateBoxes
对象)中传递new ProgressInfo(dt.Rows.Count)
而不是那个。
答案 1 :(得分:1)
看起来你的pi变量没有通过引用传递,所以它永远不会真正得到更新。在你的委托函数中,像pi.itemsProcessed ++一样改变一个值并不常见,尽管有办法like this。
一旦你的代表支持使用&#34; ref&#34;传递一个变量。关键字,那么您应该可以使用以下内容调用您的委托:
progess => UpdateProgressBar(ref pi)
您也可以将pi设为静态变量,然后也可以从您的代表处更新它,这样您就不必担心传递它。