【发布时间】:2014-08-21 04:08:03
【问题描述】:
我有一个返回 DataTable 的委托。问题是在 GetPendingThings(见下文)中,该方法在 foreach 循环的中间返回。假设我在 myThingsToAddToTable 中有一个包含 50 个对象的集合,要作为行添加到数据表中; foreach 循环将迭代 30、31,有时 32 次,然后跳转到 return 语句,使我的数据表不完整。
private delegate DataTable ExecuteQueryDelegate();
private ExecuteQueryDelegate MyThingsDelegate;
private void LoadMyThings(){
MyThingsDelegate = new ExecuteQueryDelegate(GetPendingThings);
MyThingsDelegate.BeginInvoke(this.MyThingsReceivedCallback, null);
}
private void MyThingsReceivedCallback(IAsyncResult ar) {
DataTable dt = MyThingsDelegate.EndInvoke(ar);
//do stuff with dt
}
private DataTable GetPendingThings() {
DataTable dt = CreateMyThingsDataTable();
var myThingsToAddToTable = //linq query
foreach (var a in myThingsToAddToTable){
DataRow dr = dt.NewRow();
CreateMyThingsDataRow(dr, a.x, a.y, a.z);
dt.Rows.Add(dr);
}
return dt;
}
【问题讨论】:
-
你描述的不可能;更有可能的是,存储在
myThingsToAddToTable中的查询代表的元素比您想象的要少。 (致电.Count()进行验证。) -
嗨 cdhowie,我已经尝试过了。有出入,所以绝对有可能。
-
不,除非在循环中抛出异常,否则这是不可能的。您没有返回语句,因此从循环内返回是不可能。但是,查询使用的数据可能会在循环执行时发生变化,导致您枚举的元素比开始时少。
-
你说得对。在 CreateMyThingsDataRow 方法中左右抛出未捕获的异常,导致它提前退出循环。谢谢。
标签: c# asynchronous delegates