轮询的替代方案

Posted

技术标签:

【中文标题】轮询的替代方案【英文标题】:alternatives to polling 【发布时间】:2011-11-10 13:01:07 【问题描述】:

有一个程序 X 在我的计算机上自行激活(我无法摆脱), 我在 c# 中构建了一个程序,用于检查当前激活了哪些任务(如 Windows 中的任务管理器),当它看到 X 被激活时将其关闭,

现在,问题是,如果我这样做,我将使用带有计时器控件的轮询,这会导致大量 CPU 使用,我想知道是否有其他方法可以做到这一点。 在我制作的其他程序中,这个问题一直困扰着我。

p.s:程序X是mobsync,是windows vista中负责移动设备同步的服务,它也在后台打开windows media player,占用CPU很多。 我在网上搜索了另一个解决方案,但只找到了另一个我不信任的其他人构建的程序。

【问题讨论】:

为什么不直接停止 Mobsync 服务并将其启动设置为手动模式? 如果您每秒轮询一次,这当然不会导致大量 CPU 使用。 【参考方案1】:

正如评论中所说,最好的方法是在控制面板中禁用它,如果您不能或想要以编程方式执行此操作,很容易做到这一点而不会消耗大量 CPU:

using System.ServiceProcess;

class Program

    private const int _delay = 1000;
    private const int _period = 1000;
    private const string _serviceName = "mobsync";

    public static void Main(string[] args)
    
        var sc = ServiceController.GetServices().FirstOrDefault(__s => __s.DisplayName == _serviceName);

        // If service found, launch the timer
        if (sc != null)
        
            System.Threading.Timer timer = new System.Threading.Timer((o) =>
                
                    var service = (ServiceController)o;

                    try
                    
                        if (sc.Status == ServiceControllerStatus.Running)
                            sc.Stop();
                    
                    catch
                    
                        Console.WriteLine("Error when stopping service");
                    
                , sc, _delay, _period);
        
        else
        
            Console.WriteLine("Unknown service : " + _serviceName);
        

        Console.ReadLine();
    

【讨论】:

似乎不起作用,因为没有名为 mobsync 的服务。 足够聪明,将变量替换为您要停止的服务的名称...【参考方案2】:

正如 Arnaud 在其评论中所写,您真的应该进入“服务”面板,只需将启动模式从 Automatic 设置为 Disabled(或 Manual,如果您愿意)。

然后服务将不再启动,您不需要任何类型的观察者。

此外,除了轮询之外,没有其他模型可用于此类任务。最简单的证明方法是,即使是来自 Mark 的 ProcessExplorer 也使用轮询算法,我认为他对系统以及如何有效地从中获取一些信息有非常深刻的理解。

【讨论】:

以上是关于轮询的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

vue分页列表轮询解决方案

在哪里可以找到演示轮询的优秀 C# 控制台应用程序?

java中的websocket应用

负载均衡的几种常用方案

负载均衡算法的几种常用方案

lvs为何不能完全替代DNS轮询