为什么程序中加了System.Threading.Timer后运行不长时间,整个程序停止了。

时间:2022-03-03 20:40:40
急救:为什么程序中加了System.Threading.Timer后运行不长时间,整个程序停止了。
代码如下:

using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private System.Threading.Timer timer;
        private int num=0;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer = new System.Threading.Timer(new TimerCallback(Time_Elapsed), this, 0, 10000);
        }

        void Time_Elapsed(object sender)
        {
            string n;
            n = num.ToString();
           textBox1.Text = "n";//
           num++;
           timer.Change(Timeout.Infinite, 1000);
        }
    }
}


为什么程序中加了System.Threading.Timer后运行不长时间,整个程序停止了。

9 个解决方案

#1


System.Threading.Timer是线程
你要更新UI,需要使用委托

#2


或者你这种简单应用,不处理复杂或耗时逻辑,直接用Forms.Timer(或从工具箱里拖一个出来)就好,那个是委托给UI执行的,可以直接在回调函数里给文本框赋值

#3


TimerCallback,不在创建计时器的线程上执行,而是在系统提供的 ThreadPool 线程上执行。 
所以TimerCallback访问textBox1控件,是跨线程访问,是不允许的!

#4


跨线程调用控件,是非线程安全的,要用委托的方式

#5


跨线程访问UI控件导致,使用 Control.Invoke

#6


那么,用
           Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond.ToString() + "timer in:");
应该可以正常运行了。

我试试

#7


可以运行了。
不过我发现,在  void Time_Elapsed(object sender)中设置断点,程序只有第一次运行到断点时停止下来,然后就不会在断点处停止了。


        void Time_Elapsed(object sender)
        {
            string n;
            n = num.ToString();
//此处设置了断点,不过程序没有停止下来。      
      Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond.ToString() +  n);
           //textBox1.Text = "n";//
           num++;
           timer.Change(Timeout.Infinite, 1000);
        }

#8


timer.Change(Timeout.Infinite, 1000);
之后重新执行一下timer.start试试

#9


引用
timer.Change(Timeout.Infinite, 1000);
之后重新执行一下timer.start试试

好的

#1


System.Threading.Timer是线程
你要更新UI,需要使用委托

#2


或者你这种简单应用,不处理复杂或耗时逻辑,直接用Forms.Timer(或从工具箱里拖一个出来)就好,那个是委托给UI执行的,可以直接在回调函数里给文本框赋值

#3


TimerCallback,不在创建计时器的线程上执行,而是在系统提供的 ThreadPool 线程上执行。 
所以TimerCallback访问textBox1控件,是跨线程访问,是不允许的!

#4


跨线程调用控件,是非线程安全的,要用委托的方式

#5


跨线程访问UI控件导致,使用 Control.Invoke

#6


那么,用
           Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond.ToString() + "timer in:");
应该可以正常运行了。

我试试

#7


可以运行了。
不过我发现,在  void Time_Elapsed(object sender)中设置断点,程序只有第一次运行到断点时停止下来,然后就不会在断点处停止了。


        void Time_Elapsed(object sender)
        {
            string n;
            n = num.ToString();
//此处设置了断点,不过程序没有停止下来。      
      Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond.ToString() +  n);
           //textBox1.Text = "n";//
           num++;
           timer.Change(Timeout.Infinite, 1000);
        }

#8


timer.Change(Timeout.Infinite, 1000);
之后重新执行一下timer.start试试

#9


引用
timer.Change(Timeout.Infinite, 1000);
之后重新执行一下timer.start试试

好的