正在更新状态标签C#
本文关键字:标签 状态 更新 | 更新日期: 2023-09-27 18:24:31
我有一个WinForm C#应用程序,我正在以编程方式生成一个pdf文件并通过电子邮件发送。我正在尝试显示一个状态标签,显示状态(生成文件、发送、发送成功或失败)。但它只显示最后一个状态(发送成功)。我应该如何显示状态更新?
我已经尝试了以下代码。
try
{
Status_Label.Invoke((MethodInvoker)(() => Status_Label.Text ="Generating PDF fie..."));
/*
GENERATING CODE TO CREATE PDF FILE
*/
Status_Label.Invoke((MethodInvoker)(() => Status_Label.Text = "Sending Email..."));
/*
GENERATING CODE for sending the Email
*/
Status_Label.Invoke((MethodInvoker)(() => Status_Label.Text = "Sent successfully."));
}
catch (Exception ex)
{
Status_Label.Invoke((MethodInvoker)(() => Status_Label.Text = "Sending failed."));
}
你做错了。对于这样的东西,您应该使用BackgroundWorker
。它在一个单独的线程上运行,但可以将进度发布到调用线程(通常是UI线程)。
这是因为GUI线程正在做所有的工作,而当它被困在您的方法中时,GUI不会得到更新。使用命令进行GUI更新也不起作用。因此,您必须将PDF生成和电子邮件发送放到自己的线程中。我会在GUI线程中激活一个计时器,它读取由新线程填充的(同步!)队列。如果队列中有一个新元素,则用其内容填充标签,直到线程终止,此时停止计时器。
您应该使用BackgroundWorker生成PDF文件,并使用ProgressChanged事件和ReportProgress函数更新状态标签。
除了标签,您的问题没有提到多线程。您当前是否在UI线程中执行所有生成操作?(例如,某些已注册事件(如按钮单击)的直接结果。)如果是这样,问题是在UI再次更新之前,所有代码都会执行。
如果这个只在一个线程中运行,只需更改Status_Label.Text
,然后调用Application.DoEvents()
。这将强制应用程序处理任何其他排队的UI事件,并返回到您的函数。