0

Rough context: messaging system, Communicator sends messages (increases field _messagesInTransmission), receives ACK or NAK on another thread (decreases _messagesInTransmission).

If an instance of Communicator is disposed it should stop its underlying transport instance as soon as _messagesInTransmission hits zero the next time.

How to implement this in a thread-safe way?

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
}

Does the .NET framework support me with this task?


A simple solution would be a while(_mIT != 0) loop and some Thread.Sleep, however, I want to write more appealing code if possible.

4

3 回答 3

3

你真的不想在Dispose().

考虑一种情况,您的接收应用程序崩溃并且从不 ACK/NACK 的消息之一。您将永远不会收到足够的响应来将计数器归零,并且当调用 dispose 时,可能是在 GC 或using(...){...}块期间,它将无限期地挂起。

我建议将此功能移至另一种称为OnStop().

并且只保留你Dispose()清理资源、关闭连接等的方法......

于 2013-09-17T21:17:54.557 回答
1

发送这些消息有多重要?一般来说,你应该在你的课堂上有某种Stop()方法来做你正在寻找的事情。在 Dispose 方法中执行这种操作有点危险,因为 Dispose 方法不应该有可能引发错误或挂起。

此外,请确保您的工作线程是在IsBackground设置为 true 的情况下创建的。这样,当您的应用程序关闭时,它也一定会完成。

于 2013-09-17T21:14:10.593 回答
1

做到这一点的“线程安全”方法(以及FileStream处理它的方式)是有一个Flush()阻塞的方法来写出所有挂起的写入。一旦你有了,你只需要Flush()在方法内部被调用Dispose()

现在这将导致Dispose()阻塞,但你知道吗?我们想处置阻止!如果您在工作仍在完成时不阻止 dispose,则可以释放对对象的最后一个引用(很可能发生在using块内),并且您的对象在完成处理之前将有资格进行垃圾收集。

于 2013-09-17T21:18:32.520 回答