2016-03-20 10 views
0

ich benutze die DbExecutionStrategy, um mein Programm zu unterstützen Verbindungs-Timeout bei der Abfrage des Servers, aber es funktioniert nicht wie erwartet.DbExecutionStrategy versucht mehr als MaxRetryCount

Hier ist meine Klasse:

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; 
    } 
} 

Hier ist meine Frage:

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; 
     } 
    } 

Für einen ToArray, gibt er 42 Wiederholungen, und instanziiert 14 Strategien vor der RetryLimitExceededException werfen.

Warum hört es bei 5 Versuchen nicht auf und warum erstellt es mehr als eine Instanz für eine einzelne Abfrage? Gibt es etwas, was ich nicht sehe?

enter image description here

diese meine Kontextklassen sind:

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

Können Sie den Code zeigen, wo Sie die Verbindung/die ExecutionStrategy in Ihrem Formular-Controller erhalten? – Martin

+0

aktualisiert Martin, aber ich benutze entityframework, so dass die Verbindung auf der DengineEntities connectionString erstellt wird ... und zum Testen..im Ausschalten meines Netzwerks zu erzwingen "Kann nicht verbinden" mysqlexception – George

+0

Also wo ist die ExecutionStrategy verdrahtet, tut mir leid, wenn Ich war nicht klar genug darüber, dass ich das wissen wollte. – Martin

Antwort

0

Es befindet sich auf 5 Wiederholungen anhält, in dem RetriesPerInstance Screenshot an den Werten suchen, die jeweils 6 oder 0 die 6 Wiederholungen bedeutet es 5 Mal wiederholt und das 6te Mal gestoppt.

Es klingt also wie Ihr Problem woanders ist. Wie oft wird der Form1_Load aufgerufen?

+0

ja 6 ist korrekt, aber die Gesamtzahl der Instanzen, die nicht ok mit ihm ... Nur einmal – George