我还在学习C#所以请对我很轻松。我正在考虑我正在处理的应用程序,而我似乎无法找出最佳方法。这不是表单应用程序,而是控制台。我正在收听UDP端口。我得到的UDP消息速度高达每秒10次。然后我在UDP消息中查找触发器。我正在使用一个事件处理程序,每当我得到一个新的UDP数据包时,它会调用方法来解析数据包并查找我的触发器。所以,我有这些问题。
答案 0 :(得分:2)
关于线程,我假设一个像我的线程那样监听UDP数据的线程应该是一个永久线程吗?
没有永久线程。但是应该有一个负责接收的线程。启动后,让它运行直到您不再需要接收任何消息。
同样在线程上,当我得到触发器并决定做某事时,在这种情况下发送一条消息,我知道每次我想要执行此任务时都应该使用线程池吗?
这取决于您发送消息的频率。如果您的情况更像是消费者/生产者而不是单独的发送线程是一个好主意。但是,如果您很少发送消息,则可以使用线程池。我无法定义在这种情况下罕见的含义,您应该观看您的应用并做出决定。
在线程池上,我读到它们不是很高优先级,是真的吗?如果我需要发送的消息很关键,我可以依赖线程池吗?
你可以,因为消息处理速度慢或网络速度慢而不是线程池,你的消息会更加延迟。
使用在获取UDP数据包然后调用方法时引发的事件处理程序,在下一个数据包/事件被引发之前,确保我的方法全部完成的最佳方法是什么?有时我会看到事件队列问题,因为如果任何方法花费的时间比它们应该的时间长(例如写入数据库)并且下一个数据包在100分钟后出现,则会因为无法及时消耗事件而导致事件队列增长方式。有没有好办法解决这个问题?
队列是一个完美的解决方案。如果某些消息独立于其他消息并且它们的执行不会发生冲突然后并行执行,那么您可以拥有更多队列。
答案 1 :(得分:1)
我要点你的观点:
您的倾听线程必须是永久性的'获取消息并分发消息的线程。
(2 + 3) - 查看TPL libarary你应该使用它而不是使用线程和线程池(除非你需要对操作进行一些精细的控制,从你的问题来看,这似乎是你不需要) - 正如MSDN所说:
任务并行库(TPL)基于任务的概念,它表示异步操作。在某些方面,任务类似于线程或ThreadPool工作项,但处于更高的抽象级别
查看使用MessageQueues,因为您需要的是一个接收消息的地方,将它们存储一段时间(在您的情况下在内存中)并按照您自己的节奏处理它们。
你可以自己实现这个,但是你会发现它变得很复杂,
我建议查看NetMQ - 它易于使用,特别是对于您所描述的内容,以及它在c#中的内容。