我們有一個輔助角色,根據查詢結果根據需要處理記錄併發送Azure服務總線消息,這基本上是一個隊列處理服務。作爲使用SQL Azure的最佳實踐的一部分,我們已將所有查詢語句與重試策略(檢測到瞬時錯誤並將根據定義的策略重試)包裝在一起。請注意,我們實際上是使用using語句發送消息,因此db變量沒有「泄漏」。使用Azure瞬態故障處理重試策略訪問處置關閉警告
在我們的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的論壇爲更廣泛的觀衆和這個特定的問題在一個更詳細的問題解決ov呃那裏。對於後人,你可以找到question here.
謝謝 - 事實上,它確實會立即返回,處置關閉應該不會有任何問題。我無法控制程序集添加[InstantHandle]屬性。我將暫時用內聯註釋壓制消息。 – Tommy 2013-03-25 14:44:06
@Tommy如果您無法訪問程序集,則可以添加外部註釋。請看這裏http://www.jetbrains.com/resharper/webhelp/Code_Analysis__External_Annotations.html – 2013-03-25 22:57:33