首页 > 解决方案 > BackgroundWorker 完成任务后冻结 UI

问题描述

后台工作人员在完成任务时冻结了 UI。我之前遇到过 MessageBox 无法关闭的问题(我在 RunWorkerCompleted 中遇到过),当我删除它时,程序开始冻结,cpu 使用率将达到 15%。

        public Admin()
        {
            InitializeComponent();
            DateTime newDate;
            DateTime now = DateTime.Now;
            newDate = now.AddDays(-7);
            var pathWithEnv = @"%userprofile%\Desktop\Zlecenia_Lavello\Spakowane_zlecenia_" + newDate.ToShortDateString() + "-" + now.ToShortDateString() + ".xlsx";
            var filePath = Environment.ExpandEnvironmentVariables(pathWithEnv);
            if (!backgroundWorker1.IsBusy && !File.Exists(filePath))
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }

        private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            DateTime today = DateTime.Today;
            bool isLastDayOfTheMonth = (today.DayOfWeek == DayOfWeek.Monday);
            ExportLastMonth(isLastDayOfTheMonth);
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            DateTime today = DateTime.Today;
            bool isLastDayOfTheMonth = (today.DayOfWeek == DayOfWeek.Monday);
            while (isLastDayOfTheMonth == true)
            {

            }
        }
        void ExportLastMonth(bool isLast)
        {
            if (isLast == true)
            {
                DateTime newDate;
                DateTime now = DateTime.Now;
                newDate = now.AddDays(-7);
                var pathWithEnv = @"%userprofile%\Desktop\Zlecenia_Lavello\Spakowane_zlecenia_" + newDate.ToShortDateString() + "-" + now.ToShortDateString() + ".xlsx";
                var filePath = Environment.ExpandEnvironmentVariables(pathWithEnv);
                if (!File.Exists(filePath))
                {
                    using MySqlConnection conn = new MySqlConnection(constring);
                    using (MySqlCommand cmd = new MySqlCommand("ALTER TABLE spakowane_zlecenia DROP id_zlecenia;ALTER TABLE historia_zlecen DROP id_zlecenia;INSERT INTO historia_zlecen SELECT * FROM spakowane_zlecenia; SELECT DATE_FORMAT(data_zlecenia, '%d.%m.%Y') as DATA, numer_zlecenia as NUMER, model as MODEL, uszkodzony as USZKODZONY, pracownik_odlewnia as ODLEWNIA, pracownik_szlifiernia as SZLIFIERNIA, pracownik_kontrolajakosci as 'KONTROLA JAKOSCI', pracownik_pakowanie as PAKOWANIE, etap_odlewnia as START, etap_pakowanie_end as KONIEC FROM spakowane_zlecenia;ALTER TABLE historia_zlecen ADD id_zlecenia int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;ALTER TABLE spakowane_zlecenia ADD id_zlecenia int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;", conn))
                    {
                        conn.Open();
                        using MySqlDataAdapter sqlda = new MySqlDataAdapter(cmd);
                        using DataTable dt = new DataTable();
                        sqlda.Fill(dt);

                        using (XLWorkbook wb = new XLWorkbook())
                        {
                            wb.Worksheets.Add(dt, "Arkusz1");
                            wb.SaveAs(filePath);
                            using MySqlCommand cmd2 = new MySqlCommand("TRUNCATE spakowane_zlecenia;ALTER TABLE spakowane_zlecenia DROP id_zlecenia;ALTER TABLE spakowane_zlecenia ADD id_zlecenia int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;", conn);
                            cmd2.ExecuteNonQuery();
                        }
                    }
                }
            }
        }

我希望它在程序启动时导出,并且在文件已经创建时在下次运行时不执行任何操作。

标签: c#winforms

解决方案


更正这部分:

        bool isLastDayOfTheMonth = (today.DayOfWeek == DayOfWeek.Monday);
        while (isLastDayOfTheMonth == true)
        {

        }

它每周一永远循环


顺便说一句,如果你有一个 bool,比如isLastDayOfTheMonth你不需要将它与另一个 bool 进行比较来实现一个 bool 结果

if(isLastDayOfTheMonth == true)

等同于

if(isLastDayOfTheMonth)

推荐阅读