2013-07-24 43 views
-1

我有一个WinForm C#应用程序,我正在编程生成一个pdf文件并通过电子邮件发送它。我试图显示状态标签,显示状态(生成文件,发送,发送成功或失败)。但它只显示最后的状态(发送成功)。 我应该怎么做来显示状态更新?正在更新状态标签C#

我试过下面的代码。

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.")); 
    } 
+1

您是否检查过此页面右侧“相关”部分下的任何链接..这听起来像是一个好起点http://stackoverflow.com/questions/13152075/multithreading-in- c-sharp-update-labels?rq = 1 – MethodMan

+0

使用'BackgroundWorker'。看起来你正在运行GUI线程中提到的代码。 – imlokesh

回答

3

你做错了。你应该使用BackgroundWorker这样的东西。它在单独的线程上运行,但可以向调用线程(通常是UI线程)发布进度。

1

这是因为GUI线程正在完成所有工作,并且在您的方法中卡住GUI时,GUI不会被更新。使用命令won't work either执行GUI更新。所以你必须把你的PDF生成和电子邮件发送到它自己的线程中。 我会在GUI线程中激活一个定时器,它读取正在被新线程填充的(同步!)队列。如果队列中有新元素,则用标签的内容填充该标签,直到线程终止,此时停止计时器。

+0

其实我的代码是在一个计时器内,我正在启动计时器。这是一个由它踩我自我认为... – fadd

0

除了标签,你的问题没有提到多线程。你目前是否正在UI线程中完成所有这一代? (也就是说像一个按钮点击那样的一些注册事件的直接结果)。如果是这样,问题是所有代码都会在UI再次更新之前执行。

如果这个只在一个线程中运行,只需更改Status_Label.Text,然后再调用Application.DoEvents()。这将强制应用程序处理任何其他排队的UI事件,并返回到您的功能。

+0

我的代码是在一个计时器内,并且我在表单中的END按钮上启动计时器。 – fadd

1

您应该使用BackgroundWorker生成PDF文件并使用ProgressChanged事件和ReportProgress函数来更新状态标签。