2016-10-25 11 views
0

メインタスクを実行する前に別の実行可能ファイル(実行に約30分かかります)を呼び出すプロセスがあります。顧客がプログラムがハングアップしていると思うようにならないように、またデバッグの目的で、この別々のプロセスのメモリカウンタを500msごとに更新する別のスレッドを追加しました。メモリカウンタのスレッドが動作しない

何らかの理由で、実行ファイルのメモリ使用量が(100MiB - > 500MiBの)実行中に一貫して増加しているにもかかわらず、更新されていないようです。

ループが確実に実行されていることを確認しましたが、メモリカウンタを更新できません(このマシンに必要な.exeがないため、ターゲットマシンにVSをインストールしないでください)。ここで

はコードの関連セクションあり、どのような援助をいただければ幸いです。

public static void Main() 
    { 

     try 
     { 
      Console.WindowWidth = 100; 
     } 
     catch 
     { 
      // ignored 
     } 
     ProcessStartInfo generateReport = new ProcessStartInfo 
     { 
      Arguments = 
       "/H /EH ReliabilityMontroseLOS /T D:\\InformerReports\\Archive\\ReliabilityData\\ICSSReport.csv", 
      CreateNoWindow = true, 
      FileName = @"C:\Invensys\Aim\AimInform\Inform.exe", 
      UseShellExecute = true 
     }; 
     Thread thread = new Thread(() => StartReportThread(generateReport)); 
     thread.Start(); 
     int x = 35; 
     int direction = 1; 
     Console.ForegroundColor = ConsoleColor.Green; 
     while (thread.IsAlive) 
     { 
      string line = ""; 
      for (int j = 0; j < x; j++) 
      { 
       line += " "; 
      } 
      line += "Collecting Data"; 
      string line2 = string.Format("AIM*Inform Memory Usage: {0} MiB", workingSet/Math.Pow(1024,2)); 
      Console.Clear(); 
      Console.WriteLine(line);   
      Console.WriteLine(line2);  
      x += direction; 
      if ((x == 80) || (x == 0)) 
      { 
       direction = -direction; 
      } 
      Thread.Sleep(500); 
     } 
//Everything else 

 private static void StartReportThread(ProcessStartInfo generateReport) 
    { 
     Process proc = Process.Start(generateReport); 
     while ((proc != null) && !proc.HasExited) 
     { 
      workingSet = proc.WorkingSet64; 
      Thread.Sleep(100); 
     } 
    } 

答えて

1

溶液は、かなり単純なものでしたが判明します。 System.Processはすべてのフィールドを大量にキャッシュするため、手動で更新をトリガする必要がありました。下のコードは次のようになります。

private static void StartReportThread(ProcessStartInfo generateReport) 
    { 
     Process proc = Process.Start(generateReport); 
     while ((proc != null) && !proc.HasExited) 
     { 
      proc.Refresh(); 
      workingSet = proc.WorkingSet64; 
      Thread.Sleep(50); 
     } 
    } 

これは完璧に動作します。

関連する問題