Domanda

Ho un gestore di eccezione non gestita. Essa mostra una grafica piacevole e permette agli utenti di inviare un rapporto di errore. Gli utenti possono anche lasciare il loro nome e numero di telefono e le cose, e la nostra assistenza chiamate indietro. Funziona bene, sembra buono, rende i clienti meno arrabbiato. In teoria, in ogni caso.

Il problema è che i miei usi applicativi thread in background, e le discussioni non sembrano importa se un'eccezione è stato gettato, diciamo, il filo GUI (che ha un senso), e appena continuano il loro lavoro. Che alla fine si traduce in una finestra di dialogo WER poping se l'utente lascia mia abitudine finestra soggiorno gestore di eccezioni aperta abbastanza a lungo, facendolo apparire come il gestore di errori si è schiantato.

Non ho accesso agli oggetti thread nel campo di applicazione del gestore di eccezioni, in modo da non posso sospendere. Rendendo gli oggetti thread globalmente accessibile non è una soluzione o. La mia soluzione per ora è quello di usare qualcosa come Globals.Crashed = true; nel mio gestore di eccezioni, e di avere i miei metodi di filo verificare che la proprietà ad ogni iterazione del ciclo. Non perfetto, ma riduce al minimo i danni.

Qualcuno sa un metodo meno hacky? È il mio approccio sbagliato? Devo farlo come WER fa e lanciare un programma esterno che sospende il programma principale e spettacoli l'interfaccia utente errore?

È stato utile?

Soluzione

Se si dispone di un non gestita, sconosciuta eccezione, si può supporre che qualcosa è happend e che il programma potrebbe non riuscire a fare anche la cosa più semplice. Si consideri per esempio il caso che ha consumato tutta la memoria disponibile -. allora non sarà in grado di inviare il rapporto di errore sia, perché probabilmente richiede memoria da allocare

Un approccio buono è quello di scrivere un separato piccola applicazione che fa proprio la segnalazione degli errori. Tale domanda può raccogliere i dettagli alla relazione da un file. In questo modo il gestore sconosciuta eccezione sarebbe:

  • Dump informazioni in un file nella directory temp.
  • Avvia la segnalazione degli errori app con il nome del file come argomento.
  • terminare il processo in mancanza, prima che si fa qualcosa di stupido.

Il file temporaneo deve essere rimosso dal App segnalazione degli errori.

Altri suggerimenti

Si potrebbe tenere traccia di tutti i vostri thread in un oggetto Collection globale, in modo che quando i vostri esegue gestore, potrebbe semplicemente scorrere l'oggetto raccolta e interruzione dei fili lì.

Date un'occhiata al codice in questa domanda, Suspend Process in C # , è' ll necessità di modificarlo in modo da non sospendere il tuo thread GUI e quelle che non sono quelli di sfondo che hai cominciato, ma dovrebbe fare il trucco.

L'opzione migliore, tuttavia, è quello di cercare di lanciare il vostro rapporto di errore GUI come un processo separato, passando tutte le informazioni necessarie ad esso, e poi uccidere il processo originale dal vostro gestore di eccezione non gestita, piuttosto che permettere qualsiasi cosa per l'esecuzione in un potenzialmente stato danneggiato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top