c# - 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();
}
}
}
}
}
我希望它在程序启动时导出,并且在文件已经创建时在下次运行时不执行任何操作。
解决方案
更正这部分:
bool isLastDayOfTheMonth = (today.DayOfWeek == DayOfWeek.Monday);
while (isLastDayOfTheMonth == true)
{
}
它每周一永远循环
顺便说一句,如果你有一个 bool,比如isLastDayOfTheMonth
你不需要将它与另一个 bool 进行比较来实现一个 bool 结果
if(isLastDayOfTheMonth == true)
等同于
if(isLastDayOfTheMonth)
推荐阅读
- c# - 按钮返回变量字符串的值
- python-3.x - 如何使用 systemd 服务运行 pygame 脚本?
- amazon-web-services - Appsync 更新功能滞后于我的应用程序
- java - 依赖注入在带有 Junit 5 集成测试的 SpringBoot 中不起作用
- linux - 错误:useradd:useradd 命令在 Yocto 构建中没有成功
- javascript - 为 ajax 响应自定义 DataTables 分页
- dart - Camera 0.2.0 和 Flutter 0.9.0 面临的问题
- azure-functions - 有没有办法设置 APIM 策略以使用“x-functions-key”在请求标头中发送 Azure Function API 密钥,而不是从查询参数发送它?
- matlab - 在 for 循环中为每次迭代创建一个单独的日志文件
- python - 比较无穷大