2013-03-22 32 views
2

我們有一個輔助角色,根據查詢結果根據需要處理記錄併發送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.

回答

4

我想你的ExecuteAction立即執行你的lamdba。然後你應該使用ReSharper的屬性[InstantHandle]從你的ExecuteAction方法中註釋一個lambda參數。

例如:

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

您可以導入JetBrains.Annotations.dll得到這個屬性或只是複製的所有屬性的項目內。查看JetBrains網站herehere的更多信息。

+0

謝謝 - 事實上,它確實會立即返回,處置關閉應該不會有任何問題。我無法控制程序集添加[InstantHandle]屬性。我將暫時用內聯註釋壓制消息。 – Tommy 2013-03-25 14:44:06

+0

@Tommy如果您無法訪問程序集,則可以添加外部註釋。請看這裏http://www.jetbrains.com/resharper/webhelp/Code_Analysis__External_Annotations.html – 2013-03-25 22:57:33