阻止我的线程

时间:2013-01-05 11:17:50

标签: c# multithreading

我有一个线程,我试图停止。我所做的是以下几点。

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
        }


    }

3 个答案:

答案 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)

根据您提供的信息,似乎工作线程和UI线程都在访问 threadAlive 变量。尝试使用volatile 关键字声明threadAlive,确保在没有同步问题的情况下进行跨线程访问。

volatile bool threadAlive;

要重新启动线程,首先需要确保它执行所有必要的清理。对主/ UI线程中的线程对象使用Join方法调用,以确保线程安全终止。要重新启动,只需在线程上调用Start方法。

randomImages.Join();