内存计数器线程不起作用

时间:2016-10-25 10:44:01

标签: c# multithreading

我基本上有一个进程在执行主任务之前调用另一个可执行文件(运行大约需要半个小时)。因此,客户并没有开始认为程序已经挂起,出于调试目的,我已经包含了一个单独的线程,该线程应该每隔500毫秒为这个单独的进程更新一个内存计数器。

出于某种原因,尽管可执行程序的内存使用率在其运行中持续增长(从100MiB - > 500MiB),但这似乎并没有更新。

我已经检查过并且循环肯定正在运行,我只是无法让内存计数器更新(我无法检查手表,因为我没有必要的.exe on这台机器无法在目标机器上安装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 个答案:

答案 0 :(得分: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);
        }
    }

完美无缺!