2011-12-16 4 views
5

Ho un timer impostato per 10 secondi in una delle mie finestre. E per OnTimedEvent, ho impostato il modulo da smaltire una volta scaduto il tempo. Tuttavia sembra esserci un errore diModulo di eliminazione errore filo incrociato con Timer

InvalidOperationException non gestito dal codice utente.

Operazione cross-thread non valida: controllo 'notificationForm' a cui si accede da un thread diverso dal thread su cui è stato creato.

L'errore era sulla linea

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

il codice per il mio evento timer è

private void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     this.Dispose(); 
    } 

Qualcuno sa come risolvere questo problema? Grazie!

risposta

4

Sembra che si stia utilizzando lo System.Timers.Timer.

Provare a utilizzare lo System.Windows.Forms.Timer invece e iscriversi all'evento Tick.

Se si deve usare quella Timer, si potrebbe provare a cambiare il codice per questo:

private void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    this.BeginInvoke((MethodInvoker)delegate { this.Dispose(); }); 
} 
+0

hi. Grazie per la risposta. solo wana sapere, qual è la differenza tra system.windows.form.timer rispetto al normale timer? – Thomas

+1

Timers.Timer è un timer basato su server, motivo per cui si trova su un thread diverso rispetto al modulo. Il timer di Windows gira sullo stesso thread della GUI, che è il motivo per cui un'applicazione Winforms è generalmente il timer più appropriato da utilizzare. Il timer nel ToolBox è Forms.Timer. – LarsTech

1

O semplicemente:

this.Invoke((Action)(() => { this.Dispose(); })); 

si può fare questo in una sola riga:

timer1.Tick += (_, __) => { this.Invoke((Action)(() => { this.Dispose(); })); }; 
1

Come gli altri hanno affermato, il problema è che il timer sta eseguendo un thread e sta tentando di eliminare un oggetto che era cr mangiato su un altro filo. È necessario il metodo di eliminazione per richiamare il modulo prima che tenti di accedervi.

Informazioni di base da tenere d'occhio, se si tenta di modificare un oggetto presentazione creato nella finestra di progettazione da un altro thread, è necessario verificare se è richiesto il richiamo.

void OnTick() 
{ 
    if (InvokeRequired) 
     Invoke(new MethodInvoker(OnTick)); 
    else 
    { 
     Dispose(); 
    } 
} 
2
private void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    this.Invoke(new Action(() => this.Dispose())); 
} 

Questo funziona in quanto è