c# timer控件的tick事件能在后台运行吗?即我想用程序算某个东西,当时间为一秒时停止。

我buttonclick事件用dowhile(判断时间time小于1秒),time为全局变量,被tick事件控制。怎么程序一直运行停止不了啊,是不是进入click事件后tick事件就停止运行了

1)Timer控件的Tick事件处理函数不是后台运行,而是在与窗体相同的线程中运行
2)在button_Click事件函数中,启用一个后台线程。这个后台线程执行1秒后就退出
3)你在button_Click事件中使用do while 循环,在循环期间窗体“卡住了”,所以进入不了Tick事件。追问

大侠能否简单的写几句启用后台线程的代码?

追答

1)在程序开始处添加 

using System.Threading;

2)在程序中添加一个函数,这个函数用作后台线程处理函数

void MyThreadFun()
{
   //在函数里添加你要执行的操作
}

3)在button_Click事件处理中添加

private void button1_Click(object sender, EventArgs e)
{
    //启动一个后台线程
    Thread t = new Thread(MyThreadFun);
    t.IsBackground = true;
    t.Start( );
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-17
没错,正是因为 Timer 计时器是在 UI 主线程中进行计时的,所以,要么就是在一个新线程里用 Timer 计时;要么用 System.Threading.Timer 来计时;
但是问题在于,如果一个方法不是在 UI 线程中执行,那么基于安全原因,无法直接修改 UI 上任何控件的值;但所有控件的基类 Control 提供了一个 Invoke 方法,可以让你在其他线程中调用这个方法,把要执行方法的委托给它,就能让它在 UI 线程上执行任何操作了。

System.Threading.Timer countingTimer = new System.Threading.Timer(() => {
到了时间所要执行的代码体
....
});

// 开始计时
countingTimer.Change(1000, Timeout.Infinite); // 如果不希望计时器会反复计时,第二个参数需要设置为 Timeout.Infinite
相似回答