有一个程序X在我的电脑上激活(我无法摆脱), 我在c#中构建了一个程序,用于检查当前激活的任务(如Windows中的任务管理器),当它看到X被激活时关闭它,
现在,问题是,如果我这样做,我使用定时器控件轮询,这会导致大量的CPU使用,我想知道是否有另一种方法来做到这一点。 在我制作的其他程序中,这个问题一直困扰着我。
p.s:程序X是mobsync,这是windows vista中负责移动设备同步的服务,它还在后台打开windows media player并占用大量CPU。 我在网上搜索了另一个解决方案,但只找到了另一个我不信任的人建立的程序。
答案 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使用了轮询算法,我认为他对系统有非常深刻的理解,以及如何从中有效地获取一些信息。