c# - 线程退出时如何处理 ThreadLocal 值?

标签 c# .net multithreading idisposable thread-local-storage

假设我有一个一次性类型:

class MyDisposable : IDisposable
{
    public void Dispose() { }
}

然后我希望每个线程都有自己的此类的本地副本,每个线程一个:

private readonly ThreadLocal<MyDisposable> localMyDisposable
    = new ThreadLocal<MyDisposable>(() => new MyDisposable());

现在我想确保 在线程退出之前,我对值调用 Dispose()(如果它已创建)。有什么办法吗?我的应用程序中的某些线程存在时间很短,而有些线程存在时间很长。我想确保任何短命的人都放弃他们的值(value)观。

最佳答案

CLR 中没有钩子(Hook)来通知线程退出。线程本地值最终将被 GC 删除,但您似乎对快速处置感兴趣。

唯一的方法是让线程自己执行清理。

如果您使用任务而不是线程,您可以为该任务附加一个延续,并确保资源在任务完成后被清理和重置。但是,您不能在此处使用 ThreadLocal,因为永远无法保证延续在同一线程上运行。

关于c# - 线程退出时如何处理 ThreadLocal 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24432759/

相关文章:

c# - 从 C# 分配一个 javascript 变量

c# - 如何为要与 XmlSerializer 一起使用的可选 XML 元素修饰/定义类成员?

c# - 通常只允许每个套接字地址(协议(protocol)/网络地址/端口)使用一次?

c# - 如何确保同一线程将调用服务器计算机中的 com+ 组件

c++ - 如何使用 CSingleLock 提供对此缓冲区的访问权限?

c# - 锁定公共(public)对象,并跨模块共享

java - 当通过屏障(例如 CyclicBarrier)的线程数量小于屏障限制时,屏障(例如 CyclicBarrier)是否会导致死锁?

c# - 屏保如何支持多显示器?

c# - 结合 FileStream 和 MemoryStream 以避免在接收千兆字节数据时进行磁盘访问/分页?

.net - 设置其他文件的路径时,如何引用 WPF XAML 中的根项目目录?