代码如下:
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);
}
}
}
9 个解决方案
#1
System.Threading.Timer是线程
你要更新UI,需要使用委托
你要更新UI,需要使用委托
#2
或者你这种简单应用,不处理复杂或耗时逻辑,直接用Forms.Timer(或从工具箱里拖一个出来)就好,那个是委托给UI执行的,可以直接在回调函数里给文本框赋值
#3
TimerCallback,不在创建计时器的线程上执行,而是在系统提供的 ThreadPool 线程上执行。
所以TimerCallback访问textBox1控件,是跨线程访问,是不允许的!
所以TimerCallback访问textBox1控件,是跨线程访问,是不允许的!
#4
跨线程调用控件,是非线程安全的,要用委托的方式
#5
跨线程访问UI控件导致,使用 Control.Invoke
#6
那么,用
Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond.ToString() + "timer in:");
应该可以正常运行了。
我试试
Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond.ToString() + "timer in:");
应该可以正常运行了。
我试试
#7
可以运行了。
不过我发现,在 void Time_Elapsed(object sender)中设置断点,程序只有第一次运行到断点时停止下来,然后就不会在断点处停止了。
不过我发现,在 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试试
之后重新执行一下timer.start试试
#9
好的
#1
System.Threading.Timer是线程
你要更新UI,需要使用委托
你要更新UI,需要使用委托
#2
或者你这种简单应用,不处理复杂或耗时逻辑,直接用Forms.Timer(或从工具箱里拖一个出来)就好,那个是委托给UI执行的,可以直接在回调函数里给文本框赋值
#3
TimerCallback,不在创建计时器的线程上执行,而是在系统提供的 ThreadPool 线程上执行。
所以TimerCallback访问textBox1控件,是跨线程访问,是不允许的!
所以TimerCallback访问textBox1控件,是跨线程访问,是不允许的!
#4
跨线程调用控件,是非线程安全的,要用委托的方式
#5
跨线程访问UI控件导致,使用 Control.Invoke
#6
那么,用
Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond.ToString() + "timer in:");
应该可以正常运行了。
我试试
Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond.ToString() + "timer in:");
应该可以正常运行了。
我试试
#7
可以运行了。
不过我发现,在 void Time_Elapsed(object sender)中设置断点,程序只有第一次运行到断点时停止下来,然后就不会在断点处停止了。
不过我发现,在 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试试
之后重新执行一下timer.start试试
#9
好的