Es wäre einfacher, die Verbindung im laufenden Betrieb zu erstellen, wenn die Abfrage durchgeführt wird. Ich glaube nicht, dass Ihnen ein einfacher try/catch dabei helfen würde, denn selbst wenn Sie die Verbindung im catch-Block neu initialisiert haben, müssten Sie Ihre Abfrage irgendwie erneut ausführen.
Ich empfehle dies nicht, aber man könnte eine Retry-Klasse verwenden, die die Verbindung neu initialisiert, wenn eine Ausnahme gefangen ....
public class Retry
{
public static void Do(Action action, TimeSpan retryInterval, int retryCount = 3)
{
Do<object>(() =>
{
action();
return null;
},
retryInterval, retryCount);
}
public static T Do<T>(Func<T> action, TimeSpan retryInterval, int retryCount = 3)
{
var exceptions = new List<Exception>();
for (int retry = 0; retry < retryCount; retry++)
{
try
{
if (retry > 0)
Thread.Sleep(retryInterval);
return action();
}
catch (ConnectionException ex)
{
// ***Handle the reconnection in here***
exceptions.Add(ex);
}
}
throw new AggregateException(exceptions);
}
}
Dann können Sie Ihre Anfrage nennen wie
Retry.Do(() => MyQueryMethod, TimeSpan.FromSeconds(5));
Ich habe die Basis für diesen Retry-Code von SO vor langer Zeit, erinnere mich nicht an den Thread, aber es ist nicht mein ursprünglicher Code. Ich habe es für einige Dinge jedoch ziemlich oft benutzt.
Das ist ziemlich breit, aber warum verwenden Sie eine einzelne Verbindung, warum nicht mehrere Verbindungen verwenden und Verbindung so spät wie möglich öffnen und so früh wie möglich schließen. – Habib