Applicazione si chiude da sola

di il
23 risposte

23 Risposte - Pagina 2

  • Re: Applicazione si chiude da sola

    ... ma l'EventViewver di windows l'hai controllato ? ...c'è qualcosa si o no ?
  • Re: Applicazione si chiude da sola

    sspintux ha scritto:


    ... ma l'EventViewver di windows l'hai controllato ? ...c'è qualcosa si o no ?
    Non c'è niente riguardante questa applicazione
  • Re: Applicazione si chiude da sola

    X82_marco : ci sono dei try catch in cui il catch non fà nulla , sarebbe meglio che tutti i catch scrivano a video o su file l'errore catturato
  • Re: Applicazione si chiude da sola

    surfernet ha scritto:


    X82_marco : ci sono dei try catch in cui il catch non fà nulla , sarebbe meglio che tutti i catch scrivano a video o su file l'errore catturato
    Potrei scrivere l'errore sul log consigliato da Rubik
  • Re: Applicazione si chiude da sola

    Si potresti, se hai voglia di dedicare un pochino di tempo alla questione ti consiglierei di dare un occhiata ed eventualmente utilizzare la libreria Serilog che trovi qui https://serilog.net ,è una lib gratuita ed è opensource , buon divertimento,
  • Re: Applicazione si chiude da sola

    82_marco , quello che segue sono solo riflessioni, senza pretesa di insegnarti nulla.
    quando scrivi:
                if (File.Exists(pathComando))
                {
                    try
                    {
                        File.Delete(pathComando);
                    }
                    catch { }
                }
                if (File.Exists(pathRisposta))
                {
                    try
                    {
                        File.Delete(pathRisposta);
                    }
                    catch { }
                }
                if (File.Exists(pathSemaforoRIS))
                {
                    try
                    {
                        File.Delete(pathSemaforoRIS);
                    }
                    catch { }
                }
    Che succede quando il file è in uso e la cancellazione non va a buon fine
    Ti va bene che il file che volevi cancellare non viene cancellato

    nel backgroundWorker1, dentro al while hai moltissimi try catch.
    il try non è una singola istruzione, il try quando viene compilato genera molto codice, e non è buona cosa inserirlo nei cicli, perché rallenta e non di poco il ciclo stesso.
    Inserisci il try catch, solo se strettamente indispensabile, meglio invece verificare la condizione incerta con un if.
    In ultimo, come ti è già stato fatto notare, non usi il catch, che invece è importante per decidere cosa fare in conseguenza dell'errore generato.
    Già inserire tutti i messaggi di errore in un log, ti darebbe un'idea di quante volte i try catch vengono eseguiti e perché.
  • Re: Applicazione si chiude da sola

    X82_marco : per ritentare l'esecuzione di un metodo non andato a buon fine potresti considerare Polly :

    https://alastaircrabtree.com/implementing-the-retry-pattern-using-polly/

    https://github.com/App-vNext/Poll

    https://docs.microsoft.com/it-it/dotnet/architecture/microservices/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly
  • Re: Applicazione si chiude da sola

    Rubik ha scritto:


    Che succede quando il file è in uso e la cancellazione non va a buon fine
    Ti va bene che il file che volevi cancellare non viene cancellato
    Oltre a quanto già indicato sulla cancellazione del file e l'importanza di loggare qualcosa sui catch, anche tutti i File.Exists() si possono evitare dato che il metodo File.Delete() elimina il file solo se esiste, quindi non è necessaria una verifica preventiva (che in un ciclo, magari su dispositivi tipo NAS, genera un inutile I/O).

    Ciao!
  • Re: Applicazione si chiude da sola

    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...
Devi accedere o registrarti per scrivere nel forum
23 risposte