关闭所有子线程WPF

时间:2014-12-23 15:22:12

标签: c# .net wpf

我在WPF中有一个Window,用户可以对它进行非常长的操作。用户必须能够取消这些操作。

我的所有操作都在不同的线程中。所以我的问题是: 我可以在任何时候终止从该窗口启动的所有线程,而不会明显地杀死UI线程吗?

在需要做长操作的地方,创建线程并像这样开始

 Thread thread =
            new Thread(
                new ThreadStart(
                    delegate
                    {...}));
        thread.Start();

如何将该对象传递给它?可能吗?如果它很重要我不关心线程的优雅关闭,它们可以被杀死,它仍然是一个解决方案。窗口对象是否知道它是父对象的线程?

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

通常,您不希望创建/销毁线程。每次需要时创建一个线程比在线程池和任务中创建一个更多的开销(当你需要在进程的生命周期中创建大量的线程时,这适用于指定的)。

首选方法(特别是如果你使用.Net 4.0,甚至更好的4.5)是使用任务。

有大量关于如何使用任务的文档,以及如何取消它们。 @xxbbcc在您的问题评论中发布了一个链接。

但是,如果您仍然认为处理Threads是您的最佳选择,那么您可以跟踪所有线程。然后,只要您(作为开发人员)或您的用户确定他们想要终止线程,您就可以遍历线程并在其上调用Abort()方法。

public class MyExampleClass
{
  private List<Thread> MyThreads { get; set; }

  public MyExampleClass()
  {
    MyThreads = new List<Thread>();
    InstanciateThreadsWithSomeSuperImportantOperations();
  }
  private void InstanciateThreadsWithSomeSuperImportantOperations()
  {
    var thread = new Thread();
    // some code here 

    MyThreads.Add(thread);
  }

  public void KillAllThreads()
  {
    foreach (var t in MyThreads)
    {
      if (t.IsAlive)         
        t.Abort(); // Note this isn't guaranteed to stop the thread.
    }
  }
}