c#,形式.在工作线程中调整定时器间隔值

本文关键字:定时器 调整 线程 形式 工作 | 更新日期: 2023-09-27 18:18:17

我想修改定时器的间隔值,这是一个工作线程的System.Microsoft.Timer实例当我在运行worker线程的线程中更改此值时,Timer将停止。

让我看看我的源代码

    private void Scan_Screen(object sender, EventArgs e)
    {
        textBox1.Text += "a";
    }
    private void button1_Click(object sender, EventArgs e)
    {
        g_RECEIVER_timer = new System.Windows.Forms.Timer();
        g_RECEIVER_timer.Enabled = true;
        g_RECEIVER_timer.Interval = TIMER_INTERVAL;
        g_RECEIVER_timer.Tick += new EventHandler(Scan_Screen);
    }
    private void button2_Click(object sender, EventArgs e)
    {
        g_Control_Thread = new Thread(new ParameterizedThreadStart(Control_Message_Receiver));
        g_Control_Thread.Start(200); 
    }
    //thread function
    public void Control_Message_Receiver(object v)
    { 
        g_RECEIVER_timer.Stop();
        g_RECEIVER_timer.Interval = 200;
        g_RECEIVER_timer.Enabled = true;
        g_RECEIVER_timer.Tick += new EventHandler(Scan_Screen);
    }

为什么会发生这种情况?还有,我怎样才能让它运行呢?(我想调整定时器的间隔值在工作线程)

c#,形式.在工作线程中调整定时器间隔值

你需要在UI线程上调用这个Control_Message_Receiver,因为你已经生成了另一个工作线程,并且你正在访问UI线程上下文中的对象。

不需要在工作线程方法上重新声明Tick事件。

看下面的代码片段:

    private void Scan_Screen(object sender, EventArgs e)
    {
        textBox1.Text += "a";
    }
    private void button1_Click(object sender, EventArgs e)
    {
        g_RECEIVER_timer = new System.Windows.Forms.Timer();
        g_RECEIVER_timer.Enabled = true;
        g_RECEIVER_timer.Interval = 1000;
        g_RECEIVER_timer.Tick += new EventHandler(Scan_Screen);
    }
    private void button2_Click(object sender, EventArgs e)
    {
        Thread g_Control_Thread = new Thread(new ParameterizedThreadStart(Control_Message_Receiver));
        g_Control_Thread.Start(1);
    }
    //thread function
    public void Control_Message_Receiver(object v)
    {
        //timer1.Stop(); //why stop? -- remove this instead
        IntervalChange((int)v); //call this method and invoke it on the UI thread
        g_RECEIVER_timer.Enabled = true;
        //timer1.Tick += new EventHandler(Scan_Screen); // -- remove this
    }
    delegate void intervalChanger(int time);
    void ChangeInterval(int time)
    {
        g_RECEIVER_timer.Interval = time;
    }
    void IntervalChange(int time)
    {
        this.Invoke(new intervalChanger(ChangeInterval), new object[] {time}); //invoke on the UI thread
    }

使用System.Threading.Timer可能会更好。这个可以从任何线程重新调整。但是请注意,计时器回调在线程池线程中运行。因此,如果您需要从这个回调访问GUI,则必须使用Invoke。