如何通过主线程中的名称挂起线程?

时间:2010-08-26 12:50:10

标签: c#

我有一个本地线程,它是从主线程的按钮点击事件启动的。它的名字是

“RegistrationThread”。现在我想在另一个停止按钮点击事件上停止此线程。怎么做

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

访问这个线程

名。如果我得到“RegistrationThread”,则可以暂停它。怎么做?

2 个答案:

答案 0 :(得分:1)

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

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

调用Thread.Abort通常被认为是不好的形式。通知在另一个线程中运行的代码更加安全,它是时候中止并让它在安全点自行退出。考虑到MSDN文档仅声称在线程“通常”上调用Abort()会中止该线程。这应该表明,当结果很重要时,API实际上并不适合使用。

暂停一个线程至少和中止它一样邪恶 - 如果它持有锁,暂停它可能会导致死锁。即使您的代码不包含显式锁,因此.net运行时在幕后有很多(例如,用于类初始化)可能会让您遇到麻烦。因此,微软几年前就弃用了Thread.Suspend。

为什么不向我们提供更多关于您在更高级别尝试做什么的信息,也许我们可以帮助您找到更好的方法。

答案 1 :(得分: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