【问题标题】:Is it safe to call BeginSaveChanges(null, null) to perform a Fire and Forget Async DataContext call?调用 BeginSaveChanges(null, null) 来执行 Fire and Forget Async DataContext 调用是否安全?
【发布时间】:2011-04-04 12:21:55
【问题描述】:

我注意到在使用 BeginSaveChanges(null, null) 执行许多数据库事务时,最后一个查询有时会失败。是不是因为我的 DataContext 实例死得太快而无法执行查询?

当我将代码更改为使用普通的 SaveChanges 时,所有查询都成功了。

具体来说,我正在使用 TableServiceContext 对 Azure 表存储执行查询。

编辑 - 如果我的 DataContex 的处置是真正的问题。我有什么选择?我是否应该将我的数据上下文的实例包装起来并在任务中执行我的查询?

【问题讨论】:

    标签: c# azure datacontext


    【解决方案1】:

    使用新的 C# 5 async/await 功能似乎是执行 fire and forget 方法调用的最佳方式。

    What's the new C# await feature do?

    【讨论】:

      【解决方案2】:

      首先,您应该始终将匹配的 EndXXX 方法调用为任何 BeginXXX 方法。

      那么你应该确保在调用 EndXXX 方法之前不要释放你正在调用 BeginXXX 方法的对象。


      一种保存即发即弃的方法(忽略 Dispose 问题)是将 EndXXX 作为回调传递给 BeginXXX:

      obj.BeginXXX(callback: obj.EndXXX, state: null);
      // -- or --
      obj.BeginXXX(callback: asyncResult => obj.EndXXX(asyncResult), state: null);
      

      您仍然需要确保在所有异步操作完成之前不调用obj.Dispose();

      【讨论】:

      • 如果我不期待任何回复,我能问一下为什么我需要打电话给 EndXXX 吗?
      • 这是设计模式的一部分。 EndXXX 将抛出异步操作期间发生的任何异常,并将清理和使用的资源。不要省略它,即使它只是返回 void.
      • 我该怎么做? obj.BeginSaveChanges(obj.EndSaveChanges(asyncResult???), null); BeginSaveChanges 返回我需要传递给它的 asyncResult。
      • @Vyrotek:BeginXXX 返回的 IAsyncResult 也会传递给回调。所以它应该如我的回答所示工作。替代语法:obj.BeginXXX(callback: asyncResult => obj.EndXXX(asyncResult), state: null);
      【解决方案3】:

      首先,如果您不调用 EndXXX,那么如果出现问题,您将永远不会得到异常。您可能需要先检查一下,看看您的最后一批是否引发了异常。

      【讨论】:

      • 没有,将其更改为 SaveChanges() 每次都可以正常工作。我正在循环运行一个非常简单的测试。
      • 你不应该自欺欺人 :) 在循环中调用 SaveChanges 与调用 BeginSaveChanges 完全不同。也许您遇到了服务器超载的例外情况?也许你正在超时?当您使用阻塞调用时,您本质上是在更改时间。我仍然认为您在最后一次成功调用后遇到了异常。
      猜你喜欢
      • 1970-01-01
      • 2012-07-09
      • 2013-11-08
      • 2017-02-19
      • 1970-01-01
      • 2021-03-14
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多