Ci sono altri punti che meritano attenzione:
Sembra che il codice seguente è stato scritto come fosse una sorta di ritenta per 10 volte.
Tra il primo tentativo e il decimo tentativo, trascorrerà meno di un secondo, e comunque se dopo 10 tentativi il file non è stato cancellato resta lì.
err1 deve essere azzerato anche nel catch dopo che ha raggiunto il valore 10 con un else, altrimenti alla prossima volta che si entra nella routine, err1 varrà 10, se c'è ancora errore si va al catch, e la routine non viene richiamata e err1 diventa 11, vanificando il tentativo di rieseguire la routine.
cancellapathComando:
try
{
File.Delete(pathComando);
File.Delete(pathSemaforoCOM);
err1 = 0;
}
catch
{
err1 = err1 + 1;
if (err1 < 10)
{
goto cancellapathComando;
}
}
Qui sotto invece, si tenta di scrivere con caparbietà un file, che si spera nelle 10 volte in cui si tenta, di poterlo fare, ma anche qui se la scrittura non avviene, si prosegue come se niente fosse successo.
err2, come sopra
l'uso del timer, per catturare gli errori, non è pulita, ma al momento tralascio.
creaSemaforoRisposta:
if (!File.Exists(pathSemaforoRIS))
{
timerErroreStart.Stop();
try
{
ScriviFileRisposta();
FileStream fs2 = new FileStream(pathSemaforoRIS, FileMode.Create, FileAccess.Write, FileShare.None);
StreamWriter sw2 = new StreamWriter(fs2);
sw2.WriteLine();
sw2.Flush();
fs2.Close();
err2 = 0;
}
catch
{
err2 = err2 + 1;
if (err2 < 10)
{
goto creaSemaforoRisposta;
}
}
}
else
{
if (!timerErroreStart.IsEnabled)
{
timerErroreStart.Start();
}
}
In conclusione tutti i tray catch nel backGroundWorker1, sono del tipo "prosegui se errore"
Visto che il codice funziona, farei una prova, li toglierei tutti e metterei il try prima del "while (true)" e il catch alla fine del loop, nel catch eseguirei un controllo se i file sono stati cancellati, aggiornati ecc ecc compresa la scrittura sul log dell'errore generato, eseguiti i controlli si decide come proseguire.
Oppure il try dopo "while (true)" e il catch prima della fine del loop...