C# BackgroundWorker在完成任务后冻结UI

C# BackgroundWorker在完成任务后冻结UI,c#,winforms,C#,Winforms,后台工作人员在完成任务时冻结UI。我以前遇到过MessageBox无法关闭的问题(我在RunWorkerCompleted中遇到过),当我删除它时,程序开始冻结,cpu使用率将达到15% public Admin() { InitializeComponent(); DateTime newDate; DateTime now = DateTime.Now; newDa

后台工作人员在完成任务时冻结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();
                        }
                    }
                }
            }
        }
我希望在程序启动时将其导出,并在已创建文件的下一次运行时不执行任何操作。

更正此部分:

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

        }
它每周一循环一次


顺便说一句,如果你有一个bool,比如
islastdayofmonth
,你不需要将它与另一个bool进行比较就可以得到bool结果

if(isLastDayOfTheMonth == true)
与相同

if(isLastDayOfTheMonth)

是的,但好消息是它只会在Mondays@CaiusJard不要撒谎,这是好的观点每天工作的事情的缺点,但周一是,你可能在周二写它,在周三测试和调试它,在周四完成它的QA测试,并在周五下午晚些时候部署它。然后,当你周一早上第一件事开始工作时,你会惊讶于有多少用户注意到了。@Flydog57它只是将数据从数据库导出到excel,我通过更改系统日期来测试它