web-dev-qa-db-de.com

starte einen Timer von einem anderen Thread in c #

Hallo, ich bin auf ein Problem im Zusammenhang mit dem Timer gestoßen. hoffe jemand kann helfen ..

  1. Ich habe ein Windows-Formular mit einer Schaltfläche
  2. wenn ich auf diese Schaltfläche klicke, starte ich einen parametrisierten Thread
Thread thread1 = new Thread(new ParameterizedThreadStart( execute2));
thread1.Start(externalFileParams);
  1. der Code im Thread wird sehr gut ausgeführt
  2. in der letzten Zeile dieses Threads starte ich einen Timer

.

public void execute2(Object ob)
{
    if (ob is ExternalFileParams)
    {
        if (boolean_variable== true)
          executeMyMethod();//this also executes very well if condition is true
        else
        {
            timer1.enabled = true;
            timer1.start();
            }
        }
    }
}

5 aber das Tick-Ereignis des Timers wird nicht ausgelöst

Ich arbeite an VS2008 3.5 Framework. Ich habe den Timer aus der Toolbox gezogen und seine Interval auf 300 gesetzt. Ich habe auch versucht, Enabled zu setzen. Die Methode true/false ist timer1_Tick(Object sender , EventArgs e), aber sie wird nicht ausgelöst

kann jemand vorschlagen, was ich falsch mache?

13
Swati


Sie könnten versuchen, den Timer auf diese Weise zu starten:

Fügen Sie im Formularkonstruktor Folgendes hinzu:

System.Timers.Timer aTimer = new System.Timers.Timer();
 aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
 // Set the Interval to 1 second.
 aTimer.Interval = 1000;

Fügen Sie diese Methode zu Form1 hinzu:

 private static void OnTimedEvent(object source, ElapsedEventArgs e)
 {
   //do something with the timer
 }

Klicken Sie auf Ereignis, und fügen Sie Folgendes hinzu:

aTimer.Enabled = true;

Dieser Timer ist bereits eingefädelt, sodass kein neuer Thread gestartet werden muss.

18
Gabriel

Es ist wahr, was Matías Fidemraizer sagt. Aber es gibt eine Arbeit um ...

Wenn Sie ein Steuerelement in Ihrem Formular haben, das aufgerufen werden kann (z. B. eine Statusleiste), rufen Sie einfach dieses auf!

C # Codebeispiel:

private void Form1_Load(object sender, EventArgs e)
{
    Thread sampleThread = new Thread(delegate()
    {
        // Invoke your control like this
        this.statusStrip1.Invoke(new MethodInvoker(delegate()
        {
            timer1.Start();
        }));
    });
    sampleThread.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    MessageBox.Show("I just ticked!");
}
6
321X

System.Windows.Forms.Timer funktioniert in einer Single-Threaded-Anwendung.

Überprüfen Sie diesen Link:

Bemerkungen sagen:

Ein Timer wird verwendet, um ein Ereignis in benutzerdefinierten Intervallen auszulösen. Dieser Windows-Zeitgeber wurde für eine Umgebung mit einem Thread entwickelt, in der Benutzeroberflächenthreads zum Ausführen der Verarbeitung verwendet werden. Es ist erforderlich, dass der Benutzercode über eine UI-Nachrichtenpumpe verfügt und immer von demselben Thread aus arbeitet oder den Aufruf auf einen anderen Thread verteilt.

Wenn Sie den Abschnitt "Hinweise" lesen, empfiehlt Microsoft, diesen Timer zu verwenden, um ihn mit dem UI-Thread zu synchronisieren.

3

Ich würde einen BackgroundWorker (anstelle eines raw thread) verwenden. Der Haupt-Thread würde das RunWorkerCompleted-Ereignis des Workers abonnieren : Das Ereignis wird in Ihrem Haupt-Thread ausgelöst, wenn der Thread abgeschlossen ist. Verwenden Sie diese Ereignisbehandlungsroutine, um den Timer neu zu starten.

0
Serge Wautier