我正在通过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);
}
我不确定这是否正确,所以我玩了一下,因此我的问题。
答案 0 :(得分:1)
更新中的代码是您要实现的目标的正确代码,即在不阻止接收线程的情况下按顺序处理数据。