0

我创建了一个 Messenger 库,并使其成为线程安全的,因此它可以在线程之间共享而无需担心。我主要使用 Monitor 类来实现这一点。

我有一个 Logout 例程,它可能需要一些时间才能完成,因为它会在关闭套接字等之前尝试等待事务发生。它是异步的并且具有 Begin/End 方法,但对于这个示例,我们将假装它是同步的。

如果两个线程一个接一个地调用 Logout 怎么办?我应该用第二个线程做什么?

目前我阻塞(使用 Monitor.Wait 等待来自第一个线程的脉冲)直到第一次注销完成,然后抛出 AlreadyLoggedOutException。

如果调用 Logout 但已经发生注销,我还玩弄了一个 LogoutInProgress 异常。

两者似乎都有优点和缺点,但我想知道其他人认为什么是最好的。

4

2 回答 2

2

您提到的两个中最好的选择是什么,取决于您希望库的行为方式。

我不会向消费者抛出异常,而只是在实际注销完成时为两个线程触发结束注销异步事件/方法。您应该使用哪种同步原语来实现这一点取决于您的方法/库的设计。也许如果您分享有关您提到的 Begin End 方法的更多详细信息,我将能够提出更好的建议。

这个选项会更容易编程。

于 2012-04-08T22:53:19.310 回答
0

还有第三个选项:尝试注销的第二个线程可以检测到,注销已经发生并且什么也不做。如果“注销”的约定是“要么确保用户注销,要么抛出”,那么您确实应该使注销具有幂等性。

但是,如果您不能容忍多次注销,因为这将是一个逻辑错误,您应该抛出异常。

于 2012-04-08T23:45:43.233 回答