如何创建总是在单独的线程中运行的单例?

时间:2011-04-27 09:28:07

标签: c#

我想重新提一下上一个问题How to create Singleton with async method?

想象一下消息传递应用程序(如icq) - 应始终连接到服务器并发布消息。

我需要实施课程Connection。它应该是单例,因为它内部包含“socket”,并且该套接字应该在整个应用程序生命周期中保持不变。

然后我想实现异步方法Connection.postMessage

因为postMessage可能会占用大量时间:

  • postMessage应为async
  • 如果需要,
  • postMessage应该对邮件进行排队

请注意,我的应用程序每秒发布几十条消息,因此不适合为每个postMessage调用创建新的线程。

我不太需要为邮件发布创建一个额外的线程,但我不知道在哪里以及如何。

upd:好示例http://msdn.microsoft.com/en-us/library/yy12yx1f(v=vs.80).aspx

2 个答案:

答案 0 :(得分:3)

不,Postmessage(本身)不应该是异步的。

应该

  • 是线程安全的
  • 确保处理线程正在运行
  • 对邮件进行排队(ConcurrentQueue)
  • 返回

处理线程应该

  • 等待队列
  • 处理消息
  • 可能在闲置xx毫秒时终止自身

您拥有1个消费者和多个生产者的经典生产者/消费者情况。

PostMessage是所有制作人的切入点。

答案 1 :(得分:1)

JP,

你在这里看一个典型的生产者/消费者问题......在初始化期间,Connection应该在它自己的后台线程中创建MessageQueue开始Sender

然后连接posts只是发送到队列的消息,发送者在准备就绪时进行拾取和转发。

棘手的一点是管理最大队列大小...如果生产者始终超过消费者,那么队列可以增长到不可控制的大小。最简单的方法是阻塞生成器线程,直到队列不再满。这可以通过后退ARQ来完成。即:while(queue.isFull) sleep(100, "milliseconds"); queue.add(message);如果您不需要100%传输(例如聊天应用程序),那么您可以简单地抛出一个MessageQueueFullException,而穷人客户端只需要克服它...只是永远允许他们稍后重新提交...允许用户为您管理重试。

无论如何,这就是我要解决的问题。我很想知道其他人的建议是什么。

希望事情能为你效劳。干杯。基思。