首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-02-25 
求问~定时器触发事件影响主窗体问题代码如下: public partial class Form1 : Form{App timertestpublic F

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

 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);
            }
            //}
        }

参考下吧。

热点排行