我有一个线程,我试图停止。我所做的是以下几点。
randomImages = new Thread(new ThreadStart(this.chooseRandomImage));
randomImages.Start();
这是线程调用的方法
bool threadAlive = true;
public void chooseRandomImage()
{
while(threadAlive)
{
try
{
//do stuff
}
catch (Exception exe)
{
MessageBox.Show(exe.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
现在,点击停止线程按钮后,我只需将threadAlive设置为false。 问题是线程没有立即停止,好像它已经聚集了一种形式的动力。 如何立即停止线程,并可能再次重启?
private void butStopThread_Click(object sender, EventArgs e)
{
threadAlive = false;
if(threadAlive == false)
{
//do stuff
}
}
答案 0 :(得分:2)
对不起,这是最好的方法。向上使用.NET 4.0,您应该使用任务,而不是线程,然后有一个名为CancellationToken的东西,它与变量几乎相同。
然后,取消后,您要等到处理完成。如果需要快速发生,那么 - 好吧 - 更加细化检查取消,即更频繁地检查。
如http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation所述,中止线程可能会产生严重的副作用 - 这就是通常不应使用该方法的原因。
不,停止的线程等不能神奇地重启 - 你必须把它放入你的逻辑中(重启点,保存点,长时间运行的事务步骤,记住它完成的地方)。
作为旁注 - 如果您坚持不使用任务并且可以访问.NET的最新版本,那么如果您使用Interlocked访问类方法,则不需要Volatile,这些方法以前是一些线程安全的汇编程序指令。定义
答案 1 :(得分:1)
可以通过调用从另一个线程终止线程 中止,但这有力地终止受影响的线程没有 关心它是否已完成任务并提供否 清理资源的机会。这个技术就是这个 例子是首选。
您需要使用Abort method 但不推荐
答案 2 :(得分:0)