微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# 控制台应用程序WMI 查询突然填满内存

如何解决C# 控制台应用程序WMI 查询突然填满内存

我有一个 C# 应用程序,它创建 Cimsession 或 ManagementScope 连接并每秒在数十台远程 PC 上并行查询“PercentProcessorTime”。 通常应用程序可以正常工作几个小时,然后突然开始填满内存。平均 100MB 的 RAM 使用量在一个小时内跃升 4-5GB。 我无法了解这里发生了什么。 以下是每秒钟运行的两种方法

public static bool DumpProcessescpu(string hostname)
    {
        bool overTreshold = false;
        try
        {
            Cimsessionoptions sessionoptions = new Cimsessionoptions() { Timeout = TimeSpan.FromSeconds(5) };
            using (Cimsession mySession = Cimsession.Create(hostname,sessionoptions))
            {
                string Namespace = @"root\cimv2";
                
                IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace,"WQL",queryString);

                foreach (CimInstance cimInstance in queryInstance)
                {
                    int currentValue = Convert.ToInt32(cimInstance.CimInstanceProperties["PercentProcessorTime"].Value);
                    if (showLiveData == "true") Log.Debug("{0} - {1}",hostname,currentValue.ToString());

                    if (currentValue >= treshold)
                    {
                        overTreshold = true;
                    }
                }
            }
        }
        catch (SystemException e)
        {
            Log.Error("An error occurred while querying for WMI data for " + hostname + ": " + e.Message);
        }
        return overTreshold;
    }

public static bool DumpProcessescpuLegacy(string hostname)
    {
        bool overTreshold = false;
        try
        {  
            Connectionoptions options = new Connectionoptions() { Timeout = TimeSpan.FromSeconds(5) };
            ObjectQuery query = new ObjectQuery(queryString);
            ManagementScope scope = new ManagementScope(@"\\" + hostname + @"\root\cimv2",options);
            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope,query))
            {    
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    int currentValue = Convert.ToInt32("" + queryObj["PercentProcessorTime"]);
                    if (showLiveData == "true") Log.Debug("{0} - {1}",currentValue.ToString());

                    if (currentValue >= treshold)
                    {
                        overTreshold = true;
                    }
                }
            }
        }
        catch (ManagementException e)
        {
            Log.Error("An error occurred while querying for WMI data for " + hostname + ": " + e.Message);
        }

        return overTreshold;
    }

我正在使用 Parallel.Foreach 每秒在每台远程 PC 上运行这些方法之一。 我在任何地方都使用了大量日志记录和 try-catch,并且没有错误消息。

这里可能有什么问题?我应该在哪里继续调查?

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。