【问题标题】:start a timer from different thread in c#从 C# 中的不同线程启动计时器
【发布时间】:2013-06-06 02:02:59
【问题描述】:

您好,我遇到了一些与计时器相关的问题。 希望有人能帮忙..

  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 但定时器的滴答事件没有被触发

我正在开发 VS2008 3.5 框架。我已从工具箱中拖出计时器并将其Interval 设置为 300 也尝试设置Enabled true/false 方法是 timer1_Tick(Object sender , EventArgs e) 但它没有被解雇

谁能建议我做错了什么?

【问题讨论】:

  • 这不太可能是实现您想要的最佳方式 - 如果您有一个长时间运行的任务需要更新表单的进度,那么 BackgroundWorker 是一个很好的方法。如果您需要更多的手动控制,那么池线程(查看 ThreadPool.QueueUserWorkItem)比创建自己的线程更好。
  • 您需要在其宿主窗体/控件的线程上调用 timer.start,但这是一种尴尬的方式。使用Control.BeginInvoke 调用适当的代表。

标签: c# multithreading visual-studio-2008 timer


【解决方案1】:


您可以尝试以这种方式启动计时器:

在表单构造函数中添加:

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
 }

在按钮点击事件上添加:

aTimer.Enabled = true;

此计时器已线程化,因此无需启动新线程。

【讨论】:

    【解决方案2】:

    Matías Fidemraizer 说的是真的。但是,有一个解决方法...

    当您的表单上有一个可调用的控件(例如状态栏)时,只需调用那个控件!

    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!");
    }
    

    【讨论】:

      【解决方案3】:

      System.Windows.Forms.Timer 在单线程应用程序中工作。

      查看此链接:

      备注说:

      计时器用于在 用户定义的间隔。这个窗口 定时器是专为 UI 所在的单线程环境 线程用于执行 加工。它要求用户 代码有一个可用的 UI 消息泵 并且总是从同一个操作 线程,或将调用编组到 另一个线程。

      阅读更多“备注”部分,您会发现 Microsoft 建议您使用此计时器将其与 UI 线程同步。

      【讨论】:

      • 哈哈,看我的最后一句话(在那里呆了一个小时!!):)还是谢谢你!
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-21
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多