【发布时间】:2012-03-01 17:23:22
【问题描述】:
我创建了一个 ThreadQueue 以允许更有效地加载 WPF 页面,而不会因为加载期间进行许多计算而冻结主程序。线程通常会访问 NHibernate(我对此知之甚少,因为我工作的公司为它创建了一个包装 dll。)
如果用户确定他们不再需要查看页面,我设置了代码以中止线程。我知道这样做是错误的,但目前似乎是最有效的做法。在我编写的其他线程程序中,我将使用全局变量并将它们设置在循环中,以允许线程快速而优雅地终止。该程序使用许多静态类来完成大部分计算(大而长的计算;许多可能需要长达 5 分钟才能运行)。话虽如此,将全局 die 布尔值放在静态类中可能会杀死许多运行这些计算的线程。
现在到手头的问题:Abort 不好,静态类中的全局 die 变量也是如此。线程的关键问题之一是死锁。在事务中间杀死一个线程会导致任何死锁问题吗?关于如何在静态类的冗长计算期间优雅地终止线程的任何建议?
【问题讨论】:
-
这可能不是您想要的,但您似乎正在描述一个很好的用例,可以将那些计算密集型任务卸载到某些服务(WCF 和/或 REST)中种类。如果不能选择服务,请查看 Task Parallel library 以异步方式完成工作。至少,通过让任务以 UI 线程在不需要或不可用结果时可以选择忽略的方式完成,让您的应用程序保持简单。这并不是说我们需要让 CPU 内核免于努力工作。
-
@SixtoSaez:现在正在研究任务内容。 UI 设计为仅在必要时处理数据(即用户单击选项卡 X),但即便如此,有时您只是打开错误的页面并开始处理。大多数停留不到一分钟左右,但特别是一些非常冗长。我一直在努力尽可能加快这些东西的速度(没有常驻速度专家,我只是讨厌锁定程序,尤其是当你不是很想打开那个页面的时候。)
标签: c# multithreading nhibernate static deadlock