我在WPF中有一个Window,用户可以对它进行非常长的操作。用户必须能够取消这些操作。
我的所有操作都在不同的线程中。所以我的问题是: 我可以在任何时候终止从该窗口启动的所有线程,而不会明显地杀死UI线程吗?
在需要做长操作的地方,创建线程并像这样开始
Thread thread =
new Thread(
new ThreadStart(
delegate
{...}));
thread.Start();
如何将该对象传递给它?可能吗?如果它很重要我不关心线程的优雅关闭,它们可以被杀死,它仍然是一个解决方案。窗口对象是否知道它是父对象的线程?
提前谢谢你。
答案 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.
}
}
}