gpt4 book ai didi

c# - 如何确保定期调用某些方法?

转载 作者:太空宇宙 更新时间:2023-11-03 10:54:01 25 4
gpt4 key购买 nike

System.Threading.Timer 类允许您周期性地调用一个方法:指定的方法在ThreadPool 的线程上执行。但是,如果您需要执行一个高优先级的周期性任务,则如果ThreadPool 中没有可用的线程,则无法执行该任务。

上述问题的解决方案是使用简单的后台线程和 Thread.Sleep 方法代替 System.Threading.Timer。还有其他方法可以解决这个问题吗?那么为什么System.Threading.Timer类要使用ThreadPool呢?

更新。例如,假设您有一个应用程序需要处理以不同优先级为特征的不同类别的事件。

  • 周期性事件持续时间很短,但它们具有最高优先级,因为它们确保应用程序的正常运行,因此很可能存在可用线程以完成它们。这种事件可以在应用程序启动时启动。
  • 非周期性任务 的持续时间可能更长。例如:从远程客户端请求的处理任务。这些事件的到达时间可能是随机的,因此在这种情况下使用 ThreadPool 是有意义的。

这里有一些周期性事件的例子。

  1. 应用程序需要定期检查您的互联网连接是否正常,然后定期向服务器发送请求。
  2. 客户端需要定期检查某些服务器是否已启动并正在运行。
  3. 服务器想要定期检查与其客户端的连接,以关闭较少使用的连接。

当存在具有不同优先级的任务时,使用ThreadPool 管理所有这些异构任务是否正确?或者,该池应该用于处理同类事件吗?

什么时候应该使用专用线程来处理周期性任务?什么时候使用 System.Threading.Timer 类更有意义?

特别是:我什么时候不应该使用 System.Threading.Timer 类来处理周期性任务?

最佳答案

通常,打乱线程优先级是一个非常糟糕的主意(例如,在单处理器机器上,如果您在高优先级线程上运行的代码消耗 100% 的 CPU,则可能导致机器变得无响应,因为线程永远不会被抢占).

假设您忽略了上述内容,那么一种方法是启动一个线程并设置它的优先级,并使用它来定期进行您的重要处理。例如

class Program
{
static readonly object Locker = new object();
static void Main(string[] args)
{
var importantThread = new Thread(o =>
{
while (true)
{
lock (Locker)
{
Monitor.Wait(Locker, TimeSpan.FromSeconds(3));
// do something really really important

// if some condition return;
}
}

}) {Priority = ThreadPriority.Highest};
importantThread.Start();

Console.ReadKey();
}
}

关于c# - 如何确保定期调用某些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20134831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com