2010-08-26 83 views
3

我有启动按钮单击事件从主thread.Its名的本地线程如何通过主线程的名称暂停线程?

“RegistrationThread”。现在我想停止这个线程上的另一个停止按钮点击event.How做

我停止了“RegistrationThread”这是一个本地线程,我不能通过它的

名称访问此线程。如果我得到“注册线程”,那么可以暂停它。这个怎么做?

+0

你能分享代码吗? – Jerome 2010-08-26 12:55:58

回答

1

中止一个线程通常是度量最后的手段。原因是因为它会导致很多意想不到的副作用。最佳实践是允许工作线程在预定的安全点处优雅地结束。这可以通过许多不同的方式正确完成。其中一个最简单的方法是设置一个标志,指示工作线程应该开始关闭。

public class YourForm : Form 
{ 
    private volatile bool m_Stop = false; 

    private void StartButton_Click(object sender, EventArgs e) 
    { 
    var thread = new Thread(
    () => 
     { 
     while (...) 
     { 
      // Periodically poll the m_Stop flag. 
      if (m_Stop) 
      { 
      break; 
      } 
     } 
     }); 
    thread.Start(); 
    } 

    private void StopButton_Click(object sender, EventArgs e) 
    { 
    m_Stop = true; 
    } 
} 

你如果真的中止一个线程,那么你可以随时保存客场Thread的引用,然后调用它的Abort从您的停止按钮的点击事件。

+0

放一些优雅的终止检查的想法听起来不错...... – Muse 2010-08-26 13:25:39

1

据我所知,没有很好的方法来按名称查找线程,而Thread.Name基本上只是为了使调试更容易。为什么不直接坚持对线程对象的引用呢?

可以在.net中停止(中止)和暂停另一个线程,但是这两者都不是特别可取的事情。

它通常被认为是不好的形式来调用Thread.Abort。通知在另一个线程中运行的代码是安全的,因此应该放弃并让它在一个安全的位置自行退出。考虑到MSDN文档只声称在线程“通常”中调用Abort()会中止线程。这应该是一个迹象,表明当结果很重要时,API实际上并不打算使用。

挂起线程至少和放弃线程一样邪恶 - 如果它持有锁,挂起它可能导致死锁。即使你的代码不包含明确的锁定,.net运行时也会有很多幕后(例如,用于类初始化),这可能会给你带来麻烦。因此,微软在几年前弃用了Thread.Suspend。

你为什么不给我们提供更多关于你想要在更高水平上做什么的信息,或许我们可以帮助你找到更好的方法。