C# 停止我的线程

C# 停止我的线程,c#,multithreading,C#,Multithreading,我有一个线程,我正试图停止。我所做的如下 randomImages = new Thread(new ThreadStart(this.chooseRandomImage)); randomImages.Start(); 这是线程调用的方法 bool threadAlive = true; public void chooseRandomImage() { while(threadAlive) { try

我有一个线程,我正试图停止。我所做的如下

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
        }


    }
可以通过调用从另一个线程终止一个线程 中止,但这会强制终止受影响的线程,而不会终止 关注其是否已完成任务并没有提供 清理资源的机会。图中所示的技术 最好举个例子

您需要使用,但不建议使用

可以通过调用从另一个线程终止一个线程 中止,但这会强制终止受影响的线程,而不会终止 关注其是否已完成任务并没有提供 清理资源的机会。图中所示的技术 最好举个例子


您需要使用,但不推荐使用

对不起,这是最好的方法。使用.NET4.0以上版本,您应该使用任务,而不是线程,还有一个叫做CancellationToken的东西,它的作用与您的变量几乎相同

然后,在取消后,等待处理完成。如果这种情况需要快速发生,那么——好吧——让取消检查更精细,即更频繁地检查

中止线程可能会产生严重的副作用,如中所述-这就是通常不应使用该方法的原因

不,停止的线程等不能神奇地重新启动-这必须放在逻辑中(重新启动点、保存点、分步骤长时间运行的事务,记住它在哪里完成)


作为旁注-如果您坚持不使用任务并且有权访问最新版本的.NET,那么如果您使用互锁访问类方法,则不需要Volatile,这可以归结为一些根据定义是线程安全的汇编程序指令。

很抱歉,这是最好的方法。使用.NET4.0以上版本,您应该使用任务,而不是线程,还有一个叫做CancellationToken的东西,它的作用与您的变量几乎相同

然后,在取消后,等待处理完成。如果这种情况需要快速发生,那么——好吧——让取消检查更精细,即更频繁地检查

中止线程可能会产生严重的副作用,如中所述-这就是通常不应使用该方法的原因

不,停止的线程等不能神奇地重新启动-这必须放在逻辑中(重新启动点、保存点、分步骤长时间运行的事务,记住它在哪里完成)


作为旁注-如果您坚持不使用任务,并且有权访问最新版本的.NET,那么如果您使用互锁访问类方法,则不需要Volatile,这些方法可以归结为一些根据定义是线程安全的汇编程序指令。

根据您提供的信息,工作线程和UI线程似乎都在访问threadAlive变量。尝试使用关键字声明threadAlive,该关键字用于确保跨线程访问不会出现同步问题

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

randomImages.Join();

从您提供的信息来看,工作线程和UI线程似乎都在访问threadAlive变量。尝试使用关键字声明threadAlive,该关键字用于确保跨线程访问不会出现同步问题

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

randomImages.Join();

在这个问题中有很多选择elencated@Steve我敢肯定,大多数不懂意大利语的人都不熟悉elencated的含义。只是说,是的,名单上。。。。哦,天哪,我需要一点糖来补脑。现在是吃午饭的时候了在这个问题上有很多选择elencated@Steve我敢肯定,大多数不懂意大利语的人都不熟悉elencated的意思。只是说,是的,名单上。。。。哦,天哪,我需要一点糖来补脑。该吃午饭了。哇。另一个。请看,有一个原因是,在以后的版本中,其中一个被标记为“请勿使用”。检查解释-这是一个你永远不应该调用的方法。它可能有严重的副作用。哇。另一个。请看,有一个原因是,在以后的版本中,其中一个被标记为“请勿使用”。检查解释-这是一个你永远不应该调用的方法。它可能有严重的副作用。他已经有了不稳定的副作用(正如你在他的帖子中看到的)。他只是不想让线程结束,我看不到原始帖子中使用volatile关键字声明的threadAlive变量。你能指出吗?:)此外,他希望线程立即停止。然后重新启动它。我的回答只允许这样做。忽略了这一点。对很抱歉我道歉。但从技术上讲,它不能是volatile,您可以使用联锁访问。是的,可以使用真正的联锁访问,但由于共享资源只是一个bool,volatile将用于此目的。对于更复杂的类型,如类或结构,interlocked或lock语句可以达到这个目的。他已经把它作为volatile(正如你在他的文章中看到的)来使用了。他只是不想让线程结束,我看不到threadAlive变量在t中使用volatile关键字声明