2016-03-20 29 views
0

サーバーのクエリ時にDbExecutionStrategyを使用してプログラムサポートの接続タイムアウトを設定しても、期待どおりに動作しません。DbExecutionStrategy MaxRetryCount以上の再試行

public class MyExecutionStrategy : DbExecutionStrategy 
{ 
    static MyExecutionStrategy() 
    { 
     RetriesPerInstance = new Dictionary<int, int>(); 
    } 

    private const int MaxRetryCount = 5; 
    private static TimeSpan _maxDelay = new TimeSpan(0, 0, 3); 



    private int _instanceNo; 

    public MyExecutionStrategy() : base(MaxRetryCount, _maxDelay) 
    { 
     _instanceNo = ++TotalInstances; 
     RetriesPerInstance[_instanceNo] = 0; 
    } 

    public static Dictionary<int, int> RetriesPerInstance { get; private set; } 

    public static int TotalRetries 
    { 
     get 
     { 
      return RetriesPerInstance.Values.Sum(); 
     } 
    } 

    public static int TotalInstances { get; private set; } 

    protected override bool ShouldRetryOn(Exception ex) 
    { 
     RetriesPerInstance[_instanceNo]++; 

     return true; 
    } 
} 

はここに私のクエリです:

はここに私のクラスである

private void Form1_Load(object sender, EventArgs xe) 
    { 
     var dengineEntities = new dengineEntities(); 

     try 
     { 
      var proj = dengineEntities.motorista_erro.ToArray(); 
     } 
     catch (Exception e) 
     { 
      var tries = MyExecutionStrategy.TotalRetries; 
     } 
    } 

単一てToArrayの場合、それは42回の試行を返し、RetryLimitExceededExceptionを投げる前に、14社の戦略をインスタンス化します。

5回の試行で停止しない理由と、1回のクエリで複数のインスタンスが作成される理由は何ですか?何か見ていないのですか?

enter image description here

これらは私のコンテキストクラスです:

public partial class dengineEntities : DbContext 
{ 
    public dengineEntities() 
     : base("name=dengineEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<motorista_erro> motorista_erro { get; set; } 

} 
public partial class motorista_erro 
{ 
    public int MOT_ID { get; set; } 
    public string MOT_NOME { get; set; } 
    public bool MOT_SIT_FUNC_ID { get; set; } 
    public int IDEMP { get; set; } 
} 
<connectionStrings> 
<add name="dengineEntities" ...etc...etc../> 
</connectionStrings> 
+0

Form ControllerでExecutionStrategyを使用して接続を取得するコードを表示できますか? – Martin

+0

Martinを更新しましたがentityframeworkを使用していましたので、dengineEntities connectionString ...とtest..imのためにネットワークを "Unable to connect"するように設定しました。 – George

+0

ExecutionStrategyはどこにありますか?私はそれについて知りたいと思っているほど明確ではなかった。 – Martin

答えて

0

それぞれが6回のまたは0.6の再試行を持ち、RetriesPerInstanceスクリーンショットの値を見て、5回のリトライで停止していることを意味し5回再試行し、6回目は停止しました。

あなたの問題は他の場所のようです。 Form1_Loadは何回呼び出されますか?

+0

ええ、6は正しいですが、 – George