使用Azure瞬态故障处理重试策略访问已处理的闭包警告

本文关键字:处理 闭包 警告 访问 策略 Azure 故障处理 重试 使用 | 更新日期: 2023-09-27 18:05:14

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

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

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

retryPolicy中的db变量。ExecuteAction是被标记的

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论坛上为更广泛的受众发布了这篇文章,这个问题在那里得到了更详细的解决。

使用Azure瞬态故障处理重试策略访问已处理的闭包警告

我猜你的ExecuteAction会立即执行你的lamba。然后你应该用ReSharper的属性[InstantHandle]来注解ExecuteAction方法中的lambda参数。

例如:

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

你可以导入JetBrains.Annotations.dll来获取这个属性,或者只是复制项目中的所有属性。更多信息请访问JetBrains网站。