【问题标题】:Windows Form Application, Thread won't stopWindows 窗体应用程序,线程不会停止
【发布时间】:2012-10-15 11:18:16
【问题描述】:

我正在为我的线程演示使用 Windows 窗体应用程序。当我点击 button1 时,它将启动线程并递归地做一个工作。

这里的表单不会像我预期的那样挂起。我想在单击 Button2 时停止当前正在运行的线程。但是这行不通。

        private void button1_Click(object sender, EventArgs e)
        {
            t = new Thread(doWork);          // Kick off a new thread
            t.Start();               
        }

        private  void button2_Click(object sender, EventArgs e)
        {                
            t.Abort();
        }    

        static void doWork()
        {    
            while (true)
            {
              //My work    
            }
        }
      }

.当我调试时,button2_Click 方法不会命中指针。我想是因为线程一直很忙。

如果我在某个地方出错,请纠正我。

【问题讨论】:

  • 定义“行不通”——究竟会发生什么以及您期望会发生什么?
  • 对不起。我用定义它来编辑帖子。 Tx 征求意见。 :)
  • 调试指针。这意味着该方法不会执行。 :(
  • @devan:在 button1_click 中注释代码并检查 button2_click 是否在点击时被点击...我认为没有为 button2 click.. 分配处理程序。
  • 对不起,伙计们是我的错误。谢谢你的帮助。 :)

标签: c# winforms multithreading abort


【解决方案1】:

你不能像这样杀死线程。原因是为了避免在线程中添加锁,然后在释放锁之前将其杀死。

您可以创建全局变量并使用它来控制您的线程。

简单示例:

private volatile bool m_StopThread;

private void button1_Click(object sender, EventArgs e)
{
    t = new Thread(doWork);          // Kick off a new thread
    t.Start();               
}

private  void button2_Click(object sender, EventArgs e)
{                
    m_StopThread = true;
}    

static void doWork()
{    
    while (!m_StopThread)
    {
          //My work    
    }
}

【讨论】:

  • 杀死一个线程可能不是一个好主意,但是检查你的global variable 方法内部的每个地方是不切实际的,尤其是当方法太长并且主要不依赖于任何循环构造..
  • 感谢您的回复。但这种方式没有用,因为 button2_click 方法不会被执行者击中。我认为这是其他问题。
  • @devan Button1 启动新线程,当您单击 button2 时,您将变量分配给另一个线程可见的东西。这里有什么问题?
  • @PLB :当我单击 button2 时, button2_click 方法将不会执行。因此 m_StopThread 永远不会成为真的。 :(
  • @devan 如果你有 button2 并且它的点击事件处理程序是 button2_Click 为什么它不会执行?
猜你喜欢
  • 2011-03-30
  • 2013-04-07
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2015-03-31
相关资源
最近更新 更多