我有一个 C# 类库,它启动一个后台消费者线程(延迟),该线程监听生产者/消费者队列中要完成的任务。该类库可以在任何类型的 .NET 应用程序中使用,并且当前在 ASP.NET MVC 网站下使用。消费者线程大部分时间都处于阻塞状态,直到请求进入队列。对于任何给定的应用程序域,应该只有一个使用者线程。
我希望能够在应用程序退出时优雅地关闭消费者线程,无论它是什么类型的应用程序,例如Windows 窗体、控制台或 WPF 应用程序。应用程序代码本身应该不知道该线程正在徘徊等待终止这一事实。
如何从类库的角度解决这个线程生命周期问题?是否有一些全局应用程序关闭事件我可以绑定(bind)以优雅地拆除线程?
现在,由于它位于 ASP.NET MVC 应用程序域中,因此这实际上并不重要,因为无论如何它们都不会被优雅地拆除。但现在我开始在旨在终止的计划控制台应用程序任务中使用它,我想一劳永逸地解决这个问题。控制台应用程序不会终止,因为使用者线程仍然处于事件状态并被阻止等待请求。我在类上公开了一个公共(public)静态 Thread 属性,以便在控制台应用程序退出时发出 Abort()
调用,但坦率地说,这是令人厌恶的。
任何指示将不胜感激!同样,我不想编写 Windows 窗体或 WPF 或控制台应用程序特定的代码来解决问题。类库的每个使用者都可以使用的通用解决方案将是最好的。
最佳答案
将线程的 IsBackground
属性设置为 true
。那么它不会阻止进程结束。
http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx
或者,不使用Abort
,而是使用Interrupt
。没那么恶心了。
关于c# - 后台消费者线程生命周期管理最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3558690/