读书人

求问~定时器触发事件影响主窗体有关问

发布时间: 2013-02-25 10:23:36 作者: rapoo

求问~定时器触发事件影响主窗体问题
代码如下:

public partial class Form1 : Form
{
App timertest;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
timertest = new App();
timertest.Boiled += new App.MyEventHandler(changerichtext);

}
public void changerichtext(string sender, EventArgs e)
{
this.richTextBox1.Text = sender;

}

private void button1_Click(object sender, EventArgs e)
{
richTextBox1.Text = "开始";
timertest.start();
}

}

public class TimerExampleState
{
public int counter = 0;
public System.Threading.Timer tmr;
}

public class App
{
public delegate void MyEventHandler(string sender, EventArgs e);
public event MyEventHandler Boiled; //声明事件

public void start()
{
TimerExampleState s = new TimerExampleState();

//创建代理对象TimerCallback,该代理将被定时调用
TimerCallback timerDelegate = new TimerCallback(CheckStatus);

//创建一个时间间隔为1s的定时器 ,S为输入参数,就是下面CheckStatus调用的参数。
System.Threading.Timer timer = new System.Threading.Timer(timerDelegate, s, 1000, 1000);
s.tmr = timer;

//主线程停下来等待Timer对象的终止
while (s.tmr != null)
Thread.Sleep(0);
Console.WriteLine("Timer example done.");
}



//下面是被定时调用的方法
public void CheckStatus(Object state)
{
TimerExampleState s = (TimerExampleState)state;
s.counter++;

string str = string.Format("{0} Checking Status {1}.", DateTime.Now.TimeOfDay, s.counter);
Console.WriteLine(str);

if (s.counter == 2)
{
if (Boiled != null)
{
Boiled(str, new System.EventArgs());
}
s.tmr.Dispose();
}
}
}
主窗体只有一个按钮,一个richTextBox1。一执行到事件了就卡死不动了~求大神指教~ c# timer event 定时器 事件
[解决办法]
两个问题:
1.Form中的 changerichtext方法不能这样调用,改用委托。否则会报线程间操作错误;
2. CheckStatus中的 s.tmr.Dispose()执行后tmr 并不是null,导致你的while退不出,改为while(s.counter != 2)就可以了。
[解决办法]
public delegate void SetTextHanlder(string msg);
private void invokeMsg(String obj){

if (richTextBox1.InvokeRequired)
{
richTextBox1.BeginInvoke(new SetTextHanlder(SetText), new object[] { obj });
}
}
private void SetText(string msg)
{
lock (obj)
{
richTextBox1.AppendText("\r\n" + msg);
}
//}
}

参考下吧。

读书人网 >C#

热点推荐