Sto costruendo il mio progetto con l'analisi del codice set "Microsoft regole minime" e mi dà CA2000 su questo metodo:Perché questo metodo di analisi del codice causa l'errore CA2000: chiamare Dispose()
private Timer InitializeTimer(double intervalInSeconds)
{
Timer timer = null;
try
{
timer = new Timer { Interval = intervalInSeconds * 1000, Enabled = true };
timer.Elapsed += timer_Elapsed;
timer.Start();
}
catch
{
if (timer != null)
{
timer.Dispose();
}
}
return timer;
}
Questo metodo crea solo un nuovo System.Timers.Timer
da un intervallo in secondi. Ho tre timer in funzione (uno per ogni secondo, uno ogni minuto e uno ogni mezz'ora). Forse è meglio avere un timer e controllare il gestore di eventi scaduti se è passato un minuto o mezz'ora, ma non lo so, questo è più facile in questo momento, è un codice ereditato e non voglio rompere tutto ancora.
Questo metodo mi dà l'infame
Warning 21 CA2000 : Microsoft.Reliability : In method 'TimerManager.InitializeTimer(double)', call System.IDisposable.Dispose on object '<>g__initLocal0' before all references to it are out of scope.
Ora sto chiamando Dispose il fermo pensato che questo sarebbe sufficiente? Sto anche disponendo tutti i timer nella propria implementazione idispostabile della classe.
Cosa mi manca qui?
Estrarre la sintassi di inizializzazione degli oggetti - che è quello che sta innescando l'allarme (in quanto l'oggetto esiste, costruito, ma non assegnato a 'timer' mentre l'inizializzatore è in esecuzione. Sto cercando di trovare la domanda dupe che si occupa di questo. –
possibile duplicato di [Inizializzatori oggetto in using-block genera avviso di analisi del codice CA2000] (http://stackoverflow.com/questions/3514902/object-initializers-in-using-block-genera-code-analysis-warning-ca2000) –
Beh, non buttare via la sintassi dell'inizializzatore per uno strumento stupido. L'avviso è fasullo, c'è nulla da smaltire finché non viene chiamato Start(). Ingoiando le eccezioni e restituendo un oggetto disposto, ora * che * sarebbe qualcosa di cui lamentarsi. –