首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TaskFactory().StartNew()按创建顺序完成

TaskFactory().StartNew()按创建顺序完成
EN

Stack Overflow用户
提问于 2017-01-20 16:40:19
回答 1查看 120关注 0票数 0

我正在通过UDP接收信息。消息可以到达极快,即每1ms (但这是不同的)。当收到消息时,调用一个事件:

代码语言:javascript
复制
private static void OnMessageReceived(object sender, UDPMessage message)
{
        MessageQueue.Enqueue(message);
}

可以看到,接收到的消息被放入要处理的队列中。我这样做--我不确定这是否不正确--以确保UDP接收线程可以自由地接收下一条消息(我不想阻止接收线程并阻止它接收消息)。

因此,当消息排队时,将引发MessageQueued事件:

代码语言:javascript
复制
private static void MessageQueued(object sender, EventArgs e)
{
    var processTask = new TaskFactory().StartNew(ProcessMessage);
}

ProcessMessage做了一些处理,然后向另一个应用程序发送消息.这些消息到达另一个应用程序的顺序很重要。

现在,如果消息到达得非常快,我担心的是创建的任务完成的顺序与创建它们的顺序不一样。

我需要确保任务是按照消息到达的顺序创建的,并且它们以相同的顺序转发消息。

(是的,我知道UDP并不保证消息的发送顺序与发送的顺序相同,但忘记了这一点;)

从听起来是什么样子,我想我需要等到以前的任务完成,然后标记当前的任务完成.我不想在启动当前任务之前等待上一项任务完成。

我希望这是合理的!

基于注释的更新

最初,我确实有一个由任务创建的循环,该循环不断地检查消息队列,如果一个项可用,则退出队列并对其进行处理:

代码语言:javascript
复制
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);
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-20 17:41:35

更新中的代码是您想要达到的目标的正确代码,它是按顺序处理数据,而不是阻塞接收线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41768442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档