我正在通过UDP接收信息。消息可以到达极快,即每1ms (但这是不同的)。当收到消息时,调用一个事件:
private static void OnMessageReceived(object sender, UDPMessage message)
{
MessageQueue.Enqueue(message);
}可以看到,接收到的消息被放入要处理的队列中。我这样做--我不确定这是否不正确--以确保UDP接收线程可以自由地接收下一条消息(我不想阻止接收线程并阻止它接收消息)。
因此,当消息排队时,将引发MessageQueued事件:
private static void MessageQueued(object sender, EventArgs e)
{
var processTask = new TaskFactory().StartNew(ProcessMessage);
}ProcessMessage做了一些处理,然后向另一个应用程序发送消息.这些消息到达另一个应用程序的顺序很重要。
现在,如果消息到达得非常快,我担心的是创建的任务完成的顺序与创建它们的顺序不一样。
我需要确保任务是按照消息到达的顺序创建的,并且它们以相同的顺序转发消息。
(是的,我知道UDP并不保证消息的发送顺序与发送的顺序相同,但忘记了这一点;)
从听起来是什么样子,我想我需要等到以前的任务完成,然后标记当前的任务完成.我不想在启动当前任务之前等待上一项任务完成。
我希望这是合理的!
基于注释的更新
最初,我确实有一个由任务创建的循环,该循环不断地检查消息队列,如果一个项可用,则退出队列并对其进行处理:
var ProcessMessageQueueLoop = new TaskFactory().StartNew(ProcessMessageQueueThread);
private static void ProcessMessageQueueThread()
{
while (true)
{
if (MessageQueue.Count > 0)
{
ProcessMessage();
}
}
}
private static void OnMessageReceived(object sender, UDPMessage message)
{
MessageQueue.Enqueue(message);
}我不知道这是不是正确的,所以我玩了一下,因此我的问题。
发布于 2017-01-20 17:41:35
更新中的代码是您想要达到的目标的正确代码,它是按顺序处理数据,而不是阻塞接收线程。
https://stackoverflow.com/questions/41768442
复制相似问题