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

线程与timer,该怎么解决

2013-01-11 
线程与timer用button可以让timer立即停止再立即开始private void button2_Click(object sender, EventArgs

线程与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));
}

热点排行