更新状态标签C#

时间:2013-07-24 06:54:17

标签: c# multithreading winforms function

我有一个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."));
  }

4 个答案:

答案 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事件,并返回到您的函数。