2009-04-07 15 views
4

Original-Beitrag aktivieren: How to access a timer from another class in C#Wie ein Timer aus einer anderen Thread/Klasse

ich alles versucht.

-Event

-Invoke kann nicht getan werden, weil Timer nicht Eigentum InvokeRequired haben.

-Öffentlicher/interne Eigenschaft

Nichts funktionierte, wird der Code ausgeführt wird, wird die timer.Enabled Eigenschaft festgelegt wird, auf „true“, aber es funktioniert nicht Tick.If Ich nenne das Ereignis oder einfach nur ändern die Eigenschaft aus der Formularklasse in einer NICHT-statischen Methode - es tickt und funktioniert.

Ich wusste nie, dass es einen Tag dauern würde und wahrscheinlich mehr, um einen anständigen Timer zu verwenden.

Wenn es keine Möglichkeit gibt, dies zu tun, gibt es noch etwas anderes, das ähnlich wie der Timer funktioniert (Verzögerung, Aktivieren/Deaktivieren)?

+0

John, fügen Sie bitte diese auf Ihre vorherige Frage (Sie Ihre Post bearbeiten können), da dies für andere Benutzer mit dem gleichen Problem hilfreicher wäre. –

+0

möglich duplicate von http://stackoverflow.com/questions/725413/how-to-access-a-timer-from-another-class-in-c – raven

Antwort

7

Sie sollten die Timer-Klasse aus dem System.Timers-Namespace und nicht das WinForms-Timer-Steuerelement verwenden, wenn Sie Multi-Threading-Unterstützung möchten. Überprüfen Sie die MSDN-Dokumentation für die WinForms Zeitsteuerung für weitere Informationen:

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

+0

+1 für mich zu schlagen :-) –

+0

War überrascht Seien Sie zuerst zu diesem ... –

+1

Während dies das Elapsed-Ereignis auslösen wird (der System.Timer.Timer hat ein Elapsed-Ereignis im Gegensatz zu dem Ticker-Ereignis von System.Windows.Forms.Timer), wird es innerhalb der Kontext des aufrufenden Threads und, je nachdem, was Sie im Ereignis tun, könnte eine System.InvalidOperationException wie "Cross-Thread-Operation nicht gültig: Control 'X" von einem anderen Thread als der Thread, auf dem es erstellt wurde zugegriffen . " – raven

1

ich zufällig wieder aufrufen zu verwenden versucht, dieses Mal es funktionierte, aber ich werde akzeptieren deine Antwort, DavidM.

public bool TimerEnable 
    { 
     set 
     { 
      this.Invoke((MethodInvoker)delegate 
      { 
       this.timer.Enabled = value; 
      }); 
     } 
    } 


    public static void timerEnable() 
    { 
     var form = Form.ActiveForm as Form1; 
     if (form != null) 
      form.TimerEnable = true; 
    } 
+0

Was ist, wenn Ihr Timer in einer anderen Klasse ist? Sie können nicht mit 'this' aufrufen. Ich denke, ein skalierbarer Ansatz ist @David M – nawfal

+0

danke für die Frage, Schande über mich für die Pflege eines Tages ... – kubilay

1

Nur weil System.Windows.Forms.Timer haben nicht die Fähigkeit, bedeutet nicht, zu berufen, dass das Formular nicht. Versuchen Sie meine vom zweiten (oder anderen) Thread, um den Timer zu aktivieren.

public static class ControlExtensions 
{ 
    public static TResult InvokeEx<TControl, TResult>(this TControl control, 
          Func<TControl, TResult> func) 
    where TControl : Control 
    { 
    if (control.InvokeRequired) 
    { 
     return (TResult)control.Invoke(func, control); 
    } 
    else 
    { 
     return func(control); 
    } 
    } 
} 

Damit arbeitete der folgende Code für mich:

new Thread(() => 
    { 
    Thread.Sleep(1000); 
    this.InvokeEx(f => f.timer1.Enabled = true); 
    }).Start(); 

Und der Timer gefedert sofort auf das Leben nach der 1 Sekunde.

6

Sie brauchen nicht InvokeRequired auf der Control iteself zu überprüfen, können Sie die Eigenschaft auf die Klasse zB überprüfen:

if (this.InvokeRequired) 
{ 
    BeginInvoke(new MyDelegate(delegate() 
    { 
     timer.Enabled = true; 
    })); 
} 
Verwandte Themen