Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事件处理程序计时和线程_C#_Multithreading - Fatal编程技术网

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

C# 事件处理程序计时和线程,c#,multithreading,C#,Multithreading,我还在学C#所以请对我放松点。我正在考虑我正在开发的应用程序,但似乎找不到最好的方法。这不是一个表单应用程序,而是一个控制台。我正在收听UDP端口。我以每秒10次的速度收到UDP消息。然后在UDP消息中查找触发器。我正在使用一个事件处理程序,每当我得到一个新的UDP数据包时,它都会被引发,然后调用方法来解析数据包并查找我的触发器。所以,我有这些问题 关于线程,我假设像我的线程那样侦听UDP数据的线程应该是一个永久线程 同样在线程方面,当我得到触发器并决定执行某项任务时,在本例中发送一条消息,我想

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

  • 关于线程,我假设像我的线程那样侦听UDP数据的线程应该是一个永久线程
  • 同样在线程方面,当我得到触发器并决定执行某项任务时,在本例中发送一条消息,我想每次执行此任务时都应该使用线程池
  • 在线程池上,我读到它们的优先级不是很高,这是真的吗?如果我需要发送的消息很关键,我可以依赖线程池吗
  • 对于在获取UDP数据包并调用方法时引发的事件处理程序,在引发下一个数据包/事件之前确保方法全部完成的最佳方法是什么?有时我会看到事件队列问题,因为如果任何一种方法花费的时间比它们应该花费的时间稍长(例如,写入数据库),并且下一个数据包在100毫秒后到达,那么事件队列就会增长,因为您无法及时使用事件。有什么好办法解决这个问题吗
  • 关于线程,我假设像我的线程那样侦听UDP数据的线程应该是一个永久线程

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

    同样在线程方面,当我得到触发器并决定执行某项任务时,在本例中发送一条消息,我想每次执行此任务时都应该使用线程池

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

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

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

    对于在获取UDP数据包并调用方法时引发的事件处理程序,在引发下一个数据包/事件之前确保方法全部完成的最佳方法是什么?有时我会看到事件队列问题,因为如果任何一种方法花费的时间比它们应该花费的时间稍长(例如,写入数据库),并且下一个数据包在100毫秒后到达,那么事件队列就会增长,因为您无法及时使用事件。有什么好办法解决这个问题吗

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

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

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

    同样在线程方面,当我得到触发器并决定执行某项任务时,在本例中发送一条消息,我想每次执行此任务时都应该使用线程池

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

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

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

    对于在获取UDP数据包并调用方法时引发的事件处理程序,在引发下一个数据包/事件之前确保方法全部完成的最佳方法是什么?有时我会看到事件队列问题,因为如果任何一种方法花费的时间比它们应该花费的时间稍长(例如,写入数据库),并且下一个数据包在100毫秒后到达,那么事件队列就会增长,因为您无法及时使用事件。有什么好办法解决这个问题吗


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

    我将阐述您的观点:

  • 您的列表线程必须是获取消息并分发消息的“永久”线程

  • (2+3)-看看下面的示例,您应该使用它,而不是使用线程和线程池(除非您需要对操作进行一些精细的控制,从您的问题来看,这些操作似乎不需要)-如MSDN所述:

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

  • 考虑使用MessageQueues,因为您需要的是一个接收消息的地方,将它们存储一段时间(在您的案例中存储在内存中),并按照您自己的速度处理它们

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

    我建议研究一下——它很容易使用,尤其是