仅当变量为零时执行释放

本文关键字:执行 释放 零时 变量 | 更新日期: 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块内),并且您的对象在完成处理之前将有资格进行垃圾回收。