i would like to write an Client in C# which checks if a User is logged in on different Clients. The Client should run 24/7 and refreshes a Database with some State Information for each Client.
My Problem is: The Command Line Tool takes more and more Memory, so ill think that there is a Problem that i allocate Memory which never gets released.
I think it is that i am creating a ManagementScope, but i cannot all the Dispose() Method for it.
Here is my Code:
static void Main(string[] args)
    {
        Ping pingSender = new Ping();
        PingOptions options = new PingOptions();
        string sqlconnectionstring = "Data Source=(local)\\SQLEXPRESS;Initial Catalog=clientstat;User ID=...;Password=....;Integrated Security=SSPI";
        SqlConnection clientread = new SqlConnection(sqlconnectionstring);
        clientread.Open();
        // Use the default Ttl value which is 128,
        // but change the fragmentation behavior.
        options.DontFragment = true;
        string username = "";
        // Create a buffer of 32 bytes of data to be transmitted.
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        int timeout = 120;
        while (true)
        {
            SqlCommand clientcommand = new SqlCommand("SELECT * FROM Client WHERE StateID = @stateid", clientread);
            clientcommand.Parameters.Add(new SqlParameter("stateid", 1));
            SqlDataReader clientreader = clientcommand.ExecuteReader();
            while (clientreader.Read())
            {
                string ipadress = Convert.ToString(clientreader["IP"]);
                string clientid = Convert.ToString(clientreader["ID"]);
                if (ipadress != string.Empty && clientid != string.Empty)
                {
                    // First Try To Ping Computer
                    PingReply reply = pingSender.Send(ipadress, timeout, buffer, options);
                    if (reply.Status == IPStatus.Success)
                    {
                        try
                        {
                            ManagementScope managementScope = new ManagementScope((@"\\" + ipadress + @"\root\cimv2"));
                            managementScope.Options.Username = "....";
                            managementScope.Options.Password = "...";
                            managementScope.Options.EnablePrivileges = true;
                            // ObjectQuery to Check if User is logged on
                            ObjectQuery objectQuery = new ObjectQuery("SELECT * FROM Win32_ComputerSystem");
                            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(managementScope, objectQuery);
                            ManagementObjectCollection querycollection = managementObjectSearcher.Get();
                            foreach (ManagementObject mo in querycollection)
                            {
                                // Check Here UserName
                                username = Convert.ToString(mo["UserName"]);
                                if (username != "")
                                {
                                    Console.WriteLine(ipadress + " " + username);
                                }
                            }
                            querycollection.Dispose();
                            managementObjectSearcher.Dispose();
                        }
                        catch (Exception x)
                        {
                            Console.WriteLine(x.Message);
                        }
                    }
                }
                else
                {
                    Console.WriteLine(clientid + " has no IP-Adress in Database");
                }
            }
            clientcommand.Dispose();
            clientreader.Close();
            clientreader.Dispose();
        }
    }
}
Any Ideas or Suggestions what i can improve here? Or what exactly could be a Problem?
Thanks in advance
 
     
     
     
     
     
    