【问题标题】:Access to disposed closure warning using Azure Transient Fault Handling Retry Policy使用 Azure 瞬态故障处理重试策略访问已处置的关闭警告
【发布时间】:2014-06-23 19:16:28
【问题描述】:

我们有一个工作角色,它根据查询结果处理记录并根据需要发送 Azure 服务总线消息,这基本上是一个队列处理服务。作为使用 SQL Azure 的最佳实践的一部分,我们使用重试策略包装了所有查询语句(这会检测瞬时错误并将根据定义的策略重试)。请注意,我们实际上是从 using 语句中发送消息,因此 db 变量没有“泄漏”。

在我们的 using 语句中,ReSharper 抛出“Access to Disposed Closure”警告,很可能是因为我们将 DataContext 作为重试策略的 func 参数传递。

我的问题是,我是否可以假设 ReSharper 没有正确检测到这种模式,或者在我们编写这些函数时是否有替代方法来防止上述警告?

守则

retryPolicy.ExecuteAction 中的 db 变量是被标记的对象

using (var db = new MyEntities())
{
   var thingsToUpdate = retryPolicy.ExecuteAction(() => db.QueueTable.Where(x => x.UpdateType == "UpdateType" && x.DueNext < DateTime.UtcNow).Take(30).ToList());
   if (!thingsToUpdate.Any())
   {
      return;
   }
   while (thingsToUpdate.Any())
   {
      var message = new ServiceMessage{
                            Type = "UpdateType",
                            Requests = thingsToUpdate.Select(x => new ServiceMessageRequest
                                {
                                    LastRan = x.LastRan,
                                    ParentItemId = x.ThingId,
                                    OwnerId = x.Thing.ForiegnKeyid
                                }).ToList()
                        };
      SendMessage("UpdateType", message);
      foreach (var thing in thingsToUpdate )
      {
          thing.LastRan = DateTime.UtcNow;
          thing.DueNext = DateTime.UtcNow.AddMinutes(10);
      }
      retryPolicy.ExecuteAction(() => db.SaveChanges());
      thingsToUpdate = db.QueueTable.Where(x => x.UpdateType == "UpdateType" && x.DueNext < DateTime.UtcNow).Take(30).ToList());
     }
}

其他信息

我还将此问题发布到 ReSharper 论坛以供更广泛的受众使用,并且该特定问题在此处得到了更详细的解决。对于后人,您可以找到question here.

【问题讨论】:

    标签: c# azure resharper


    【解决方案1】:

    我猜你的 ExecuteAction 会立即执行你的 lamdba。然后,您应该使用 ReSharper 的属性 [InstantHandle] 注释 ExecuteAction 方法中的 lambda 参数。

    例如:

    public void ExecuteAction([InstantHandle] Action action)
    {
      ...
    }
    

    您可以导入 JetBrains.Annotations.dll 来获取此属性,也可以只复制项目中的所有属性。在 JetBrains 网站 herehere 上查看更多信息。

    【讨论】:

    • 谢谢 - 它确实会立即返回,并且处置的闭包应该没有任何问题。我无法控制程序集以添加 [InstantHandle] 属性。我会暂时用内联 cmets 压制消息。
    • @Tommy 如果您无权访问程序集,则可以添加外部注释。见这里jetbrains.com/resharper/webhelp/…
    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多