2014-12-23 41 views
0

我在WPF中有一个窗口,用户可以在其上启动非常长的操作。用户必须能够取消这些操作。关闭所有的子线程WPF

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

在哪里,我需要做长期的经营场所线程创建并启动这样

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

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

预先感谢您。

+0

你如何开始线程? – 3dGrabber

+2

http://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource%28v=vs.110%29.aspx – xxbbcc

+5

请参阅[取消托管主题](http://msdn.microsoft.com /en-us/library/dd997364%28v=vs.110%29.aspx) –

回答

0

通常你不想创建/销毁线程。每次创建线程时,在线程池和任务中创建线程所需的开销要比线程池和任务时多(如果需要在进程的生命周期中创建大量的线程,就像指定一样)。

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

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

但是,如果您仍然认为处理线程是您的最佳选择,那么您可以跟踪所有线程。然后,无论您(作为开发人员)还是您的用户确定他们想要杀死该线程,都可以遍历这些线程并在其上调用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. 
    } 
    } 
} 
+2

[不推荐'请放弃'](http:// stackoverflow .com/questions/27561976/check-if-thread-finished-its-method-before-killing-it-c-sharp/27562048#27562048) –

+0

使用中止或其他方法是另一个问题。当然,我可以创建一个线程列表并杀死它们,而且看起来我必须这样做。 这实际上是我的问题 - 我可以做到这一点,而无需手动观看正在运行的线程(它们已停止,将它们从列表中删除等)。 当然,如果我可以做到这一点没有我的代码 – Rouz

+0

@SriramSakthivel我试图不建议使用线程的所有,但我没有看到另一种方式杀死线程。 – Cameron