我有一个本地线程,它是从主线程的按钮点击事件启动的。它的名字是
“RegistrationThread”。现在我想在另一个停止按钮点击事件上停止此线程。怎么做
我停止“RegistrationThread”这是一个本地线程,我不能通过它的
访问这个线程名。如果我得到“RegistrationThread”,则可以暂停它。怎么做?
答案 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
。