在c#中从不同的线程启动计时器

本文关键字:线程 启动 计时器 | 更新日期: 2023-09-27 17:50:43

嗨,我遇到了一些与定时器有关的问题。希望有人能帮忙…

  1. 我有一个windows窗体包含一个按钮
  2. 当我点击该按钮时,我启动一个参数化线程
Thread thread1 = new Thread(new ParameterizedThreadStart( execute2));
thread1.Start(externalFileParams);
  1. 线程内的代码执行得非常好
  2. 在这个线程的最后一行,我启动一个定时器

.

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,但是定时器的tick事件没有触发

我正在开发VS2008 3.5框架。我已经从工具箱中拖动定时器,并将其Interval设置为300,也试图设置Enabled为真/假方法是timer1_Tick(Object sender , EventArgs e),但它没有发射

谁能建议我做错了什么?

在c#中从不同的线程启动计时器


您可以尝试这样启动计时器:

添加表单构造函数this:

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

将此方法添加到Form1:

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

On button click event add this:

aTimer.Enabled = true;
这个定时器已经有线程了,所以不需要启动一个新线程。

Matías fidemrazer说的是真的。但是,有一个工作…

当你的窗体上有一个可调用的控件(例如:(状态栏),只需调用它!

c#代码示例:
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!");
}

System.Windows.Forms。定时器在单线程应用程序中工作。

查看此链接:

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

评论说:

定时器用于引发事件用户定义的时间间隔。这个窗户定时器是为单线程环境,其中UI线程用于执行处理。它要求用户代码有一个可用的UI消息泵并且总是从相同的角度出发线程,或将调用编组到另一个线程。

阅读更多的"备注"部分,你会发现微软建议你使用这个定时器与UI线程同步。

我会使用BackgroundWorker(而不是raw线程)。主线程将订阅工作线程的RunWorkerCompleted事件:当线程完成时,该事件将在主线程中触发。使用此事件处理程序重新启动计时器。