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

标签 c# .net multithreading threadpool

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/

相关文章:

c# - yield 和 Parallel.ForEach 的奇怪行为

c# - <% %> 之外的文本的正则表达式

c# - 在 Lucene.net 中,我想在同一个方面类别中执行 AND 但似乎没有简单的方法可以做到这一点

c# - Linq order by, group by 和 order by each group?

c# - 为什么 Stack、Queue 和 List 在删除项目后不收缩内部数组?

.net - Windows 工作流是否可以封装到 Web 服务中,以便任何类型的客户端都可以触发它?

c# - 从 TypeBuilder.CreateType 返回的类型的 Activator.CreateInstance 抛出 ArgumentException

c# - 泛型类型的泛型类型约束

.net - 将 CancellationToken 添加到 WebApi 导致 415

pandas - 为什么 Pandas 创建多个线程,而其内部操作是单线程的?