【问题标题】:Delegate returns prematurely代表提前返回
【发布时间】: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


【解决方案1】:

只有在循环内的方法调用之一抛出异常时才有可能,这将导致方法根本不返回任何值,而是提前终止并将异常传播给调用者(在这种情况下,调用EndInvoke()时会出现异常。

您查询的数据很可能在循环中发生变化,但由于枚举期间的修改,应该触发InvalidOperationException

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2020-10-14
    相关资源
    最近更新 更多