仅当变量为零时执行释放
本文关键字:执行 释放 零时 变量 | 更新日期: 2023-09-27 18:31:36
粗略的上下文:消息传递系统,Communicator
发送消息(增加字段_messagesInTransmission
),在另一个线程上接收ACK或NAK(减少_messagesInTransmission
)。
Communicator 的实例,则下次_messagesInTransmission
达到零时,它应该立即停止其基础传输实例。
如何以线程安全的方式实现这一点?
public void Dispose()
{
_state = State.Stopping; // immediately change state in order to prevent additional messages to be sent
// TODO: wait for _messagesInTransmission to become zero
}
.NET 框架是否支持我完成此任务?
一个简单的解决方案是一段时间(_mIT != 0)循环和一些Thread.Sleep,但是,如果可能的话,我想编写更具吸引力的代码。
你真的不想在Dispose()
上这样做。
考虑接收应用程序崩溃并且从未 ACK/NACK 的消息之一的情况。你永远不会收到足够的响应来将计数器归零,并且当调用释放时,可能在 GC 或 using(...){...}
块期间,它将无限期挂起。
我建议将此功能移动到另一种称为 OnStop()
的方法。
只需保留清理资源、关闭连接等Dispose()
方法......
发送这些消息有多重要?通常,您应该在类上具有某种Stop()
方法来执行所需的操作。在 Dispose 方法中执行此操作有点危险,因为 Dispose 方法不应该有引发错误或挂起的可能性。
此外,请确保创建工作线程时IsBackground
设置为 true。这样,当您的应用程序关闭时,它肯定也会完成。
"线程安全"方法(以及FileStream
处理它的方式)是使用一个阻塞的Flush()
方法,该方法会写出所有挂起的写入。一旦你有了它,你只需要在Dispose()
方法中调用Flush()
。
现在这会导致Dispose()
阻止,但你知道吗?我们要处理阻止!如果在工作仍在执行时未阻止释放,则可能会释放对对象的最后一个引用(很可能发生在using
块内),并且您的对象在完成处理之前将有资格进行垃圾回收。