我想重新提一下上一个问题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
答案 0 :(得分:3)
不,Postmessage(本身)不应该是异步的。
应该
处理线程应该
您拥有1个消费者和多个生产者的经典生产者/消费者情况。
PostMessage是所有制作人的切入点。
答案 1 :(得分:1)
JP,
你在这里看一个典型的生产者/消费者问题......在初始化期间,Connection
应该在它自己的后台线程中创建MessageQueue
开始Sender
。
然后连接posts
只是发送到队列的消息,发送者在准备就绪时进行拾取和转发。
棘手的一点是管理最大队列大小...如果生产者始终超过消费者,那么队列可以增长到不可控制的大小。最简单的方法是阻塞生成器线程,直到队列不再满。这可以通过后退ARQ来完成。即:while(queue.isFull) sleep(100, "milliseconds"); queue.add(message);
如果您不需要100%传输(例如聊天应用程序),那么您可以简单地抛出一个MessageQueueFullException,而穷人客户端只需要克服它...只是永远允许他们稍后重新提交...允许用户为您管理重试。
无论如何,这就是我要解决的问题。我很想知道其他人的建议是什么。
希望事情能为你效劳。干杯。基思。