【问题标题】:C# - How to implement Pause/Resume semantics?C# - 如何实现暂停/恢复语义?
【发布时间】:2012-05-02 04:21:50
【问题描述】:

在我正在创建的应用程序中,我有两个组件希望用户能够暂停/恢复。我想知道可能存在哪些标准模式来支持暂停和恢复,如果有的话?这两个组件都执行大量网络 I/O。看起来,在高层次上,我必须坚持每个组件当前的工作队列——但坚持它是我在寻找这些标准模式的地方吗?我是否序列化组件本身?我是否只对作品进行序列化?我序列化为什么格式(xml、数据库等)? .NET 内置的哪些内容可能会有所帮助?有没有图书馆可以帮助解决这个问题?如果用户只是在同一个应用程序会话中暂停/恢复,或者他们在打开、关闭然后再次打开应用程序后暂停/恢复,是否有任何差异需要考虑?将这些信息保存在不同的计算机上怎么样?

从过去的经验或想到的模式有什么建议吗?我希望这会变成更多关于执行此操作的各种方法以及每种方法的优缺点的讨论。谢谢。

【问题讨论】:

  • 你只是暂停组件之间的通信,“工作”会继续积累,还是工作也暂停?如果暂停的工作需要在应用程序终止后继续存在,它肯定会有所作为。消息队列将允许您累积工作(消息)而不会丢失应用程序终止的风险,但可能是比所需更重的解决方案。
  • Scott - 不,应用程序暂停时工作不会累积。你能解释一下如果应用程序被终止,消息队列将如何生存吗?也许提供有关您所指的此消息队列结构的更多详细信息?我的两个组件都已经有工作队列,但是如果应用程序关闭,它们将无法生存。谢谢。

标签: c# design-patterns serialization


【解决方案1】:

我所说的消息队列是指 MSMQ 或它的兄弟之一。所有消息都将保存在某种数据库中,因此在应用程序重新启动时仍然可用。此类队列的主要目的是确保即使在通信断断续续和/或不可靠的情况下也能传递消息。

听起来你可以让你的通信组件很容易地从 MSMQ 而不是你当前的队列中工作。

如果这不适合您的应用程序,它可能就像在终止时序列化现有队列中的对象并在应用程序启动时再次反序列化它们一样简单。如果幸存的意外终止很重要,您应该始终在将对象添加到工作队列时对其进行序列化,但此时您可能需要再次查看现有的消息队列系统。

【讨论】:

  • 谢谢斯科特!看起来 MSMQ 会满足我的需求。
【解决方案2】:

您可以实现线程,并相应地在线程上调用 Suspend() 和 Resume() 函数。

【讨论】:

  • 这些方法都已弃用,并且在应用程序会话中不起作用(例如打开应用程序、开始工作、暂停工作、关闭应用程序、打开应用程序、恢复)。
  • 除了 Chad 的 cmets 之外,Suspend 和 Resume 方法是一个非常糟糕的主意,因为它们不能很好地处理网络 I/O。您不仅想暂停,还想在协议序列中的正确点暂停,并在必要时保持任何保持活动状态。
  • 我明白了,stackoverflow.com/questions/142826/… 可能会有所启发。
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 2020-06-14
  • 1970-01-01
相关资源
最近更新 更多