民意调查的替代方案

时间:2011-11-10 13:01:07

标签: c# polling

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

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

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

2 个答案:

答案 0 :(得分:2)

正如评论中所述,最好的方法是在控制面板中禁用它,如果你不能或想要以编程方式进行,那么很容易消耗大量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();
    }
}

答案 1 :(得分:1)

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

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

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