C# 线程停止得不够快

C# 线程停止得不够快,c#,wpf,multithreading,slider,C#,Wpf,Multithreading,Slider,嗨,对不起,我的英语很差 在我的WPF应用程序中,我有一个RepeatButton,它增加一个滑块值 每次滑块值更改时,我必须停止正在生成图片的线程,并根据新滑块值再次运行相同的线程: Console.WriteLine("Request stop !"); requestStop(); Console.WriteLine(bw.IsAlive.ToString()); valuetogener

嗨,对不起,我的英语很差

在我的WPF应用程序中,我有一个RepeatButton,它增加一个滑块值

每次滑块值更改时,我必须停止正在生成图片的线程,并根据新滑块值再次运行相同的线程:

  Console.WriteLine("Request stop !");
                requestStop();
                Console.WriteLine(bw.IsAlive.ToString());

                valuetogenerate = searchValueToGenerate();

                bw = new Thread(() => bw_DoWork());
                requestStart();
                bw.Start();
声明

 private volatile bool _shouldStop;
我的请求停止和启动方法:

  public void requestStop()
    {
        _shouldStop = true;
    }

    public void requestStart()
    {
        _shouldStop = false;
    }
还有嫁妆:

 while (!_shouldStop && !(allvaluegenerated))
        {

            for (int i = 0; i < valuetogenerate.Count - 1; i++)
            {

             Console.WriteLine("i :" + i + " " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());

                if (!_shouldStop)
                {

                      .... generating pictures     

                }
                else
                {
                     i = valuetogenerate.Count + 1;
                }
            }
        }

 Console.WriteLine("Thread stopped");
正如你们所看到的,当我要求停止时,线程并没有停止


在requestStop之后使用thread.abort解决了我的问题,但这不是停止线程的最优雅的方式。

您应该只请求取消线程,并让线程自己处理取消过程。如果这意味着线程需要一段时间才能完成,那么就这样吧。中止线程只能作为最后手段

但无论如何。。。当_shouldStop==true时,为什么不打破循环呢

if (!_shouldStop)
{
  .... generating pictures     
}
else
{
   break;
}

啊,我明白了。。。您正在设置i的值,以便循环条件发生变化

如果您需要在异步情况下(如两个线程)停止/启动交互,则将始终存在延迟。因此,您不能期望发出stop命令,并期望它将立即停止

想象两个人通过电子邮件交流——即使对方已经阅读了邮件,你也不知道对方何时会收到——如果你需要知道,你必须等待回复,例如定期检查

一种方法是阻塞自己的线程,直到另一个线程停止,这样您可以保持程序流,但不能在主线程中执行任何其他操作

另一种选择是实现某种类型的事件,该事件在线程停止时触发,并在线程停止代码后放置

您还可以在特定的时间间隔内检查线程是否已停止,然后继续

一些框架类(如Task)提供了在任务完成后执行某些代码的方法,这可能是线程停止代码后的一个位置

异步/等待模式也可能对您有所帮助。看一看。我认为这是最先进的方法,一旦你习惯了,它也很容易使用。
有很多选择,每种选择都有不同的复杂性、性能和缺点。选择一个最适合您的需要。

您只想停止线程以更新UI??否,线程允许我将图片放入哈希表,哈希表用于我的主线程。每次停止并运行线程时,我都会使用新的图片缓存系统更新哈希表。图片显示在图像组件中。如果我有误解,请原谅,但是如果这与UI操作有关,为什么选择使用线程而不是委托和调度程序。BeginInvoke启动它?您可以尝试加入,而不是thread.abort,但这可能仍然不会方便地结束线程。当应用程序第一次运行时,线程生成100张图片,之后,每次滑块改变值时,我在哈希表中拍摄第一张图片以显示它,并运行线程生成第101张图片,第一张图片将从哈希表中删除。拍摄并显示图片比生成并显示图片花费的时间更少。我使用线程是因为我不希望每次滑块更改值时应用程序都冻结。应用程序的目标是显示图形并在图形中移动,图形可能比24h更重要,线程似乎在无休止地运行循环而从不暂停。是的,while循环条件需要注意感谢响应。我将尝试您的第二个异步/等待解决方案,希望它能将应用程序冻结几毫秒
if (!_shouldStop)
{
  .... generating pictures     
}
else
{
   break;
}