TaskFactory()。StartNew()按创建顺序完成

时间:2017-01-20 16:40:19

标签: c# task-parallel-library

我正在通过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);
}

我不确定这是否正确,所以我玩了一下,因此我的问题。

1 个答案:

答案 0 :(得分:1)

更新中的代码是您要实现的目标的正确代码,即在不阻止接收线程的情况下按顺序处理数据。