我有一个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."));
}
答案 0 :(得分:3)
你做错了。你应该使用BackgroundWorker
这样的东西。它在一个单独的线程上运行,但可以将进度发布到调用线程(通常是UI线程)。
答案 1 :(得分:1)
那是因为GUI线程正在完成所有工作,当它停留在您的方法中时,GUI将不会更新。使用命令won't work either执行GUI更新。因此,您必须将PDF生成和电子邮件发送到自己的主题中。 我在GUI线程中激活一个计时器,它读取由新线程填充的(synchronized!)队列。如果队列中有新元素,则用标签内容填充标签,直到线程终止,此时停止计时器。
答案 2 :(得分:1)
您应该使用BackgroundWorker生成PDF文件,并使用ProgressChanged事件和ReportProgress函数来更新您的状态标签。
答案 3 :(得分:0)
除了标记之外,您的问题没有提到多线程。你目前在你的UI线程中做了这一代吗? (即,作为某个注册事件的直接结果,如按钮单击。)如果是这样,问题是所有代码在UI再次更新之前执行。
如果此仅在一个主题中运行,则只需更改Status_Label.Text
,然后再调用Application.DoEvents()
。这将强制应用程序处理任何其他排队的UI事件,并返回到您的函数。