事件处理程序计时和线程处理

本文关键字:线程 处理 程序 事件处理 | 更新日期: 2023-09-27 18:34:00

我还在学习C#,所以请对我放轻松。我正在考虑我正在处理的应用程序,但我似乎无法找出最佳方法。这不是一个表单应用程序,而是一个控制台。我正在侦听 UDP 端口。我每秒收到 UDP 消息的速度快到 10 次。然后,我在 UDP 消息中查找触发器。我正在使用每次获得新的 UDP 数据包时都会引发的事件处理程序,然后它将调用方法来解析数据包并查找我的触发器。所以,我有这些问题。

  1. 关于线程,我假设像我的线程这样侦听 UDP 数据的线程应该是永久线程?
  2. 同样在线程上,当我获得触发器并决定做某事时,在这种情况下发送一条消息,我收集到每次我想执行此任务时都应该使用线程池?
  3. 在线程池上,我读到它们的优先级不是很高,这是真的吗?如果我需要发送的消息很关键,我可以依赖线程池吗?
  4. 对于在我收到 UDP 数据包然后调用方法时引发的事件处理程序,确保在引发下一个数据包/事件之前完成所有方法的最佳方法是什么?有时我会看到事件队列问题,因为如果任何方法花费的时间比它们应该花费的时间长一点(用于 exampe 写入数据库(,并且下一个数据包在 100 毫秒后出现,您将获得事件队列增长,因为您无法及时使用事件。有没有解决这个问题的好方法?

事件处理程序计时和线程处理

关于线程,我假设像我的线程这样侦听 UDP 数据的线程应该是永久线程?

没有永久线程。但是,应该有一个线程负责接收。启动后,让它运行,直到您不再需要接收任何消息。

同样在线程上,当我获得触发器并决定做某事时,在这种情况下发送一条消息,我收集到每次我想执行此任务时都应该使用线程池?

这取决于您发送消息的频率。如果您的情况更像是消费者/生产者,而不是用于发送的单独线程,那么这是一个好主意。但是,如果您很少发送消息,则可以使用线程池。在这种情况下,我无法定义稀有意味着多久一次,您应该观察您的应用程序并做出决定。

在线程池上,我读到它们的优先级不是很高,这是真的吗?如果我需要发送的消息很关键,我可以依赖线程池吗?

你可以,这更像是你的消息会因为消息处理速度慢或网络速度慢而不是线程池而延迟。

对于在我收到 UDP 数据包然后调用方法时引发的事件处理程序,确保在引发下一个数据包/事件之前完成所有方法的最佳方法是什么?有时我会看到事件队列问题,因为如果任何方法花费的时间比它们应该花费的时间长一点(用于 exampe 写入数据库(,并且下一个数据包在 100 毫秒后出现,您将获得事件队列增长,因为您无法及时使用事件。有没有解决这个问题的好方法?

队列是一个完美的解决方案。如果某些消息独立于其他消息,并且它们的执行不会冲突,然后并行执行它们,则可以拥有更多队列。

我会解决你的观点:

  1. 您的列表线程必须是获取消息并分发消息的"永久"线程。

  2. (2+3( - 查看 TPL libarary,您应该使用它,而不是使用线程和线程池(除非您需要对操作进行一些精细控制,从您的问题来看,您似乎不需要( - 正如 MSDN 所述:

    任务并行库 (TPL( 基于任务的概念,它表示异步操作。在某些方面,任务类似于线程或 ThreadPool 工作项,但抽象级别更高

  3. 考虑使用 MessageQueues,因为您需要的是一个接收消息的地方,将它们存储一段时间(在您的情况下在内存中(并按照自己的节奏处理它们。

    你可以自己实现它,但你会发现它很快就会变得复杂,

    我建议研究一下 NetMQ - 它易于使用,特别是对于您所描述的内容,并且它是 c# 中的。