读书人

线程与timer,该怎么解决

发布时间: 2013-01-11 11:57:35 作者: rapoo

线程与timer
用button可以让timer立即停止再立即开始
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
timer1.Enabled = true;
}
但是用线程却只能停止timer停止不能再开始
private void button4_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(thd));
th.Start();
}
private void thd()
{
while (true)
{
timer1.Enabled = false;
timer1.Enabled = true;
Thread.Sleep(100);
}
}

能说说是为什么吗???
[解决办法]
由于Timer是主线程创建的,只要把Timer在线程里创建就可以了,附上代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int a = 0;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(thd));
th.Start();
}
private void thd()
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 100;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Tick);
timer.Enabled = true;
}


private void timer1_Tick(object sender, EventArgs e)
{
if (a < 10000)
{
a++;

}
else
{
a = 0;
}
ProcessDelegate showProcess = new ProcessDelegate(LabelShow);
this.label1.Invoke(showProcess);
}
public delegate void ProcessDelegate();
public void LabelShow()
{
label1.Text = a.ToString();
}

}

}
[解决办法]
类似问题我之前问过,涉及的是跨线程操作控件的问题。
跨线程直接操作timer容易出问题,可能破坏了其内部机制,导致跨线程的时候直接操作timer只能停止它却不能启动它。
用Invoke呀


private void timerEnable(object sender,EventArgs e)
{
while (true)
{
timer1.Enabled = false;
timer1.Enabled = true;
Thread.Sleep(100);
}
}

private thd()
{
Invoke(new EventHandler(timerEnable));
}

读书人网 >C#

热点推荐