我们有一个工作角色,它根据查询结果处理记录并根据需要发送 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 论坛以供更广泛的受众使用,并且在那边更详细地解决了这个特定问题。对于后代,您可以在此处找到问题。