代码之家  ›  专栏  ›  技术社区  ›  Sandeep Pathak

如何从主线程中按名称挂起线程?

c#
  •  3
  • Sandeep Pathak  · 技术社区  · 14 年前

    “RegistrationThread”。现在我想在另一个停止按钮上停止此线程事件。如何做

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

    姓名。如果我得到“RegistrationThread”,那么就可以挂起它。怎么做?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Brian Gideon    14 年前

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

    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 从停止按钮点击事件。

        2
  •  1
  •   blucz    14 年前

    可以停止(中止)和挂起.net中的另一个线程,但是这两种方法都不是特别可取的。

    一般认为打电话是不好的线程。中止. 更安全的做法是通知在另一个线程中运行的代码是时候中止了,让它自己在一个安全点退出。假设MSDN文档只声明在线程上调用Abort()通常会中止线程。这应该是一个信号,表明API真的不打算在结果重要时使用。

    挂起线程至少和中止线程一样有害——如果它持有锁,挂起它可能会导致死锁。即使您的代码不包含显式锁,.net运行时也有许多可能给您带来麻烦的幕后操作(例如用于类初始化)。因此,微软不赞成线程。挂起几年前。