Служба Windows повышает использование процессора - PullRequest
0 голосов
/ 14 февраля 2019

Я создал службу Windows , которая будет сохранять данные из Биометрия в базу данных.

Я использовал Mysql в качестве базы данных, а затем ZKTeco as Биометрия .Чтобы получить данные из биометрии, я использовал dll .но основная проблема заключается в том, что сервис увеличивает загрузку процессора с HIGH с 0.01% до 30-50% и не падает, если я не нажму стоп, а затем снова запустится.

Я пытался поставить thread.sleep, где большинство = случаев - это решение, но не решает мое, я использую backgroundworker, поскольку это минимизирует использование процессора, а не использование таймера.

как я могу решить или исправить ВЫСОКИЙ ЦП?я попробовал thread.sleep(5000 5 секунд, thread.sleep(1000) 1 секунду и наконец thread.sleep(10) ничего не получалось

 private void sendata()
    {
        try
        {
            //fetch db parameter by inifile
            _Host = _inifile.ReadSetting("Database Connection", "Host", 5000, "");
            _User = _inifile.ReadSetting("Database Connection", "User", 5000, "");
            _Port = _inifile.ReadSetting("Database Connection", "DBPort", 5000, "");
            _DBname = _inifile.ReadSetting("Database Connection", "Name", 5000, "");

            //Data from Biometric
            ICollection<MachineInfo> lstMachineInfo = manipulator.GetLogData(objZkeeper, int.Parse(MachineNo));

            //MySQL Connection
            connectionString = @"server=" + _Host + @";user id=" + _User + @";port=" + _Port + @";password=hj^yr490Tweh@ty4;database=" + _DBname + @";Min Pool Size=5;Max Pool Size=100;";

            //Connection Starts
            using (var con = new MySqlConnection(connectionString))
            {

                con.Open();
                var cmd = con.CreateCommand();
                var cmdid = con.CreateCommand();

                cmd.CommandText ="set foreign_key_checks=0;CREATE TABLE IF NOT EXISTS `z_log`(`log_id` INT(11) NOT NULL AUTO_INCREMENT ,`machine_id` VARCHAR(50) NOT NULL,`subscription` VARCHAR(50) NOT NULL,`branch_id` VARCHAR(50),`user_id` VARCHAR(50),`datetime` VARCHAR(255),`checktype` VARCHAR(50),`accesstoken` VARCHAR(50),`status` VARCHAR(50) ,PRIMARY KEY (`log_id`),UNIQUE(`datetime`))ENGINE =INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COMMENT='List of ID type'";
                cmd.ExecuteNonQuery();


                //Get todays data
                var result = lstMachineInfo.ToList().Where(a => a.datetime > DateTime.Now).ToList();

                //fetch todays data
                foreach (var data in result)
                {
                    //Check last id
                    cmdid.CommandText =
                        "SELECT IF(COUNT(*)=0,0,(SELECT log_id FROM `z_log` ORDER BY log_id DESC LIMIT 1)) AS `ID` FROM z_log;";
                    var drd = cmdid.ExecuteReader();
                    while (drd.Read())
                    {
                        counts = Convert.ToInt32(drd["ID"].ToString()) + 1;
                        Thread.Sleep(10);
                    }
                    drd.Close();

                   //save data where userid & datetime are not duplicate
                    string inserquery =
                        "INSERT IGNORE Into z_log(log_id,machine_id,subscription,branch_id,user_id,datetime,checktype,accesstoken,status)VALUES(" +
                        "@logid,@id,@subs,@branch,@user,@date,@check,@token,@status);";


                    cmd = new MySqlCommand(inserquery, con);
                    cmd.Parameters.AddWithValue("@logid", counts);
                    cmd.Parameters.AddWithValue("@id", data.MachineNumber);
                    cmd.Parameters.AddWithValue("@subs", Subscription.ToString());
                    cmd.Parameters.AddWithValue("@branch", BranchID.ToString());
                    cmd.Parameters.AddWithValue("@user", data.IndRegID);
                    cmd.Parameters.AddWithValue("@date", data.DateTimeRecord);
                    cmd.Parameters.AddWithValue("@check", data.InOut);
                    cmd.Parameters.AddWithValue("@token", AccessToken.ToString());
                    cmd.Parameters.AddWithValue("@status", "0");
                    cmd.ExecuteNonQuery();
                    Thread.Sleep(10);
                }
                con.Close();
            }

        }
        catch (Exception ex)
        {
            Errorlogs(ex.ToString());
        }
    }

//Onstart
protected override void OnStart(string[] args)
      {
         ReadIni();
         ZKBack.RunWorkerAsync();
      }

//Do Work
private void ZKBack_DoWork(object sender, DoWorkEventArgs e)
    {
        try
        {   
            //If device is not connected will connect
            if (isDeviceConnected == false)
            {
                Connect();

            }
            //if connected will get data
            else
            {
                sendata();
            }

        }
        catch (Exception ex)
        {
            Errorlogs(ex.ToString());
        }
    }

 private void ZKBack_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Thread.Sleep(10);
        ZKBack.RunWorkerAsync();
    }

1 Ответ

0 голосов
/ 14 февраля 2019

Чего ты здесь пытаешься достичь?Запуск этого процесса данных на интервале?Кстати, я использовал таймеры, и я не считаю, что они используют много процессора.Интересно, если вы создаете здесь циклический шаблон, запустив RunWorkerAsync в событии RunWorkerCompleted.Я также избавился бы от этих Thread.Sleep (s).

private void ZKBack_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Thread.Sleep(10);
    ZKBack.RunWorkerAsync();
}
...