2011-11-10 8 views
1

自分のコンピュータで自分自身を起動するプログラムXがあります(取り除くことはできません) Windowsでタスクマネージャが起動していることを確認するプログラムをC#でビルドしました)、Xがアクティブになっていることを確認したら、それをシャットダウンします。ポーリングの代替方法

今、私がこれを行うと、私はタイマーコントロールでポーリングを使用しています。これを行う別の方法があるのだろうかと思っています。 この問題は、私が作った他のプログラムでもうんざりしています。

p.s:プログラムXはモバイルデバイスの同期を担当するWindows Vistaのサービスであるmobsyncで、Windows Media Playerをバックグラウンドで開き、多くのCPUを使用します。 私は別の解決方法をオンラインで検索しましたが、信頼できない他の誰かが作成した別のプログラムしか見つかりませんでした。

+6

Mobsyncサービスを直接停止し、手動モードで開始するのはなぜですか? –

+0

1秒ごとにポーリングすると、CPU使用量が増えることはありません。 – svick

答えて

2

としてはコメントで言った、最善の方法は、あなたがカントまたはプログラムにそれを実行したい場合はCPUを大量に消費するwhitout、それはそれを行うのは簡単です、コントロールパネルでそれを無効にすることです:

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(); 
    } 
} 
+0

mobsyncという名前のサービスがないので、ニースでシンプルな+1 – Matt

+0

は動作していないようです。 –

+3

停止したいサービスの名前で変数を置き換えるのに十分にスマートにしてください... –

1

Arnaudがすでにコメントに書いていたように、実際にサービスパネルに入って、開始モードをAutomaticからDisabled(または好きな場合はManual)に設定するだけです。

サービスがもう開始されず、ウォッチャーは必要ありません。

また、この種のタスクに使用できるポーリング以外のモデルはありません。証明する最も簡単な方法は、MarkのProcessExplorerでもポーリングアルゴリズムを使用しています。私は彼がシステムを非常に深く理解しており、情報を効率的に取得する方法があると思います。

関連する問題