c# timer控件的tick事件能在后台运行吗?即我想用程序算某个东西,当时间为一秒时停止。
我buttonclick事件用dowhile(判断时间time小于1秒),time为全局变量,被tick事件控制。怎么程序一直运行停止不了啊,是不是进入click事件后t...
我buttonclick事件用dowhile(判断时间time小于1秒),time为全局变量,被tick事件控制。怎么程序一直运行停止不了啊,是不是进入click事件后tick事件就停止运行了
展开
2个回答
展开全部
1)Timer控件的Tick事件处理函数不是后台运行,而是在与窗体相同的线程中运行
2)在button_Click事件函数中,启用一个后台线程。这个后台线程执行1秒后就退出
3)你在button_Click事件中使用do while 循环,在循环期间窗体“卡住了”,所以进入不了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( );
}
展开全部
没错,正是因为 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
但是问题在于,如果一个方法不是在 UI 线程中执行,那么基于安全原因,无法直接修改 UI 上任何控件的值;但所有控件的基类 Control 提供了一个 Invoke 方法,可以让你在其他线程中调用这个方法,把要执行方法的委托给它,就能让它在 UI 线程上执行任何操作了。
System.Threading.Timer countingTimer = new System.Threading.Timer(() => {
到了时间所要执行的代码体
....
});
// 开始计时
countingTimer.Change(1000, Timeout.Infinite); // 如果不希望计时器会反复计时,第二个参数需要设置为 Timeout.Infinite
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询