实现的功能:有“开始”和“停止”两个按钮,点“开始”,立即执行事件;点“停止”则立即停止。private void timer3_Tick(object sender, EventArgs e)
{
      Thread threadMonitor = (new Thread(new ThreadStart(Monitor)));
      threadMonitor.Start();
} public void Monitor()
 {  
    string mystring = "hello!";
    for (int i = 0; i < mystring.Length; i++)
    {
        MessageBox.Show(mystring[i].ToString());
    }
 }  private void 开始_Click(object sender, EventArgs e) //点击可立即开始
 {
      timer3_Tick(null,null);
      timer3.enabled=true;
 } private void 结束_Click(object sender, EventArgs e) //本次事件完成后才结束
 {
       timer3.enabled=false;
 }点“结束”按钮如何立即结束?求帮助,小弟这厢有礼了

解决方案 »

  1.   

    你的代码要实现什么呢?为什么要在线程里面去MessageBox.Show
    如果真的需要在线程里面触发一个事件让界面去弹出messagebox的话,建议用委托,invoke之类东东实现。
    另外你的结束按钮不是仅仅要结束timer,还要结束很多个之前启动并且没有跑完的线程吧?
    如果这样就需要用事件(CreateEvent)之类的东东去控制线程退出。
      

  2.   

    .net框架废弃了早先1.0框架里的有关线程suspend、stop等方法,因为这些纯粹是成事不足败事有余的,所以被废弃了。
      

  3.   

    public void Monitor()
     {  
      string mystring = "hello!";
      for (int i = 0; i < mystring.Length; i++)
      {
       // 这里加一个等待event事件
      if(WaitForSingleObject(m_hCloseEvent) == WAIT_TIMEOUT)
      {
         break;
      }
      MessageBox.Show(mystring[i].ToString());
      }
     }在主线程的开始按钮处理中创建Event m_hCloseEvent = CreateEvent(....);
    线程函数带一个Event参数。
    停止按钮处理设置Event SetEvent(m_hCloseEvent);
    这样所有没有跑完的线程都会退出了。
      

  4.   

    上面写错了
    if(WaitForSingleObject(m_hCloseEvent,0) != WAIT_TIMEOUT)
      

  5.   

    timer.close() 或者 timer.sleep();
      

  6.   

    做一个全局 Flag,线程定期检查这个 Flag,如果要关其它线程,就将它标记为 Flase,然后这些线程读到 Flag == False,就启动退出线程的相关代码。用了全局数据,希望大家有更简单的方法
      

  7.   

    问题解决,谢谢各位
    public partial class Form1 : Form
    {
    static public bool flag;
    public Form1()
    {
    InitializeComponent();
    }static public void Monitor()

    string mystring = "hello!";
    for (int i = 0; i < mystring.Length; i )
    {
    if (flag == false)
    break;
    else
    {
    MessageBox.Show(mystring[i].ToString());
    }
    }
    }
    private void button1_Click(object sender, EventArgs e)
    {
    timer1_Tick(null,null);
    timer1.Enabled = true;
    flag = true;
    }private void button2_Click(object sender, EventArgs e)
    {
    timer1.Enabled = false;
    flag = false;
    }private void timer1_Tick(object sender, EventArgs e)
    {
    Thread threadMonitor = (new Thread(new ThreadStart(Monitor)));
    threadMonitor.Start();
    }