c# - 后台消费者线程生命周期管理最佳实践

标签 c# .net multithreading queue producer-consumer

我有一个 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/

相关文章:

Python Queue.get(block=False) 与非空队列。它可以引发Queue.empty吗?

java try catch block 无法使用反射工作 - 不知道为什么,也可能是线程错误

c# - Asp.Net MVC4 中的复选框列表

c# - Azure Functions Kubernetes 找不到 local.settings.json

c# - 处理 .NET 应用程序许可的最简单方法是什么?

.net - System.Data.SQLConnection 的跟踪和诊断

c# - 如何测试给定的功能代码单元 (C#) 是否不创建/写入任何文件到磁盘?

c# - 为什么 MapInheritedProperties() 将我的实体映射到两个表中?

C# - 具有属性和节点值的 Xml 元素

java - 不断向AsyncTask传入数据?