У меня есть этот фрагмент кода (драйвер панели управления):
string strIP = ip1; //.Replace(',','.');
byte[] bytes = Encoding.UTF8.GetBytes(strIP);
unsafe
{
fixed (byte* pIP = bytes)
{
int ddd = Huidu_InitDll(nSreenID, 2, pIP, strIP.Length + 1);
if (ddd != 0)
{
MessageBox.Show("error");
sendmail(Convert.ToString(Huidu_GetLastError()));
return;
}
}
}
Много раз он выдает ошибку (и электронную почту) из-за высокого пинга, я думаю. Как решить это, например, попробуйте 3 раза, а затем отправьте отчет об ошибке?
int retries = 3;
bool done = false;
do
{
try { YourFunction(); done = true; }
catch { retries--; }
while (!done && retries > 0);
if (!done)
ShowError();
Этот фрагмент кода, который я использовал в некоторых проектах, несколько раз пытается выполнить действие. Он пытается выполнить действие определенное количество раз, и если возникают различные типы исключений, он прерывается немедленно.
public static void Try(Action action, int tryCount = 3) {
if (action == null)
throw new ArgumentNullException("action");
if (tryCount <= 0)
throw new ArgumentException("tryCount");
Exception lastException = null;
bool lastTryFailed = true;
int timesRemaining = tryCount;
while (timesRemaining > 0 && lastTryFailed) {
lastTryFailed = false;
try {
action();
} catch (Exception ex) {
if (ex != null && lastException != null &&
!(
ex.GetType() == lastException.GetType() ||
ex.GetType().IsSubclassOf(lastException.GetType()) ||
lastException.GetType().IsSubclassOf(ex.GetType())
)
) {
throw new InvalidOperationException("Different type of exceptions occured during the multiple tried action.", ex);
}
// Continue
lastException = ex;
lastTryFailed = true;
}
timesRemaining--;
}
if (lastTryFailed) {
throw new InvalidOperationException("Action failed multiple times.", lastException);
}
}
Вы можете использовать простую базу механизмов повтора в цикле while и счетчике.
const int numTries = 3;
int currentTry = 0;
while (true)
{
if (DoTheThing())
{
break;
}
currentTry++
if (currentTry == numTries)
{
//throw or report error
break;
}
}