2016-08-14 69 views
-1

我有一个不会报告进度的Backrgound工作人员。我需要得到一个确切的值,而不是一个百分比。我不确定如何编码进度更改事件。我已将WorkReportsProgress属性设置为true。我对C#还是比较陌生,所以请原谅我的糟糕知识。后台工作人员不会报告进度

private void BKGWork_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     for (int i = 1; i <= 20; i++) 
     { 
      //do work 
      worker.ReportProgress(i); 
     } 
    } 
private void BKGWork_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     //not sure how to get the exact value of i and compare it to see which loop the background worker is in. 
    } 

回答

1

使用worker.ReportProgress(0,i);传递您的显式值作为用户状态参数。可以使用在e.UserState访问此强制转换为int

+0

尝试了这种方法,但仍没有得到任何结果。控制台完全空白。 –

+0

您是否调用了'RunWorkerAsync'来启动后台工作?你确定你的事件处理程序已订阅。 – FloatingKiwi

+0

我弄明白了,我还没有宣布ProgressChanged事件。你的方法有效。 –

2

无论你传递给ReportProgress作为第一个参数是您在e.ProgressPercentage获得的价值,BackgroundWorker的类不能计算为你“百分比”。如果你需要一个更复杂的数据(一个类的实例,例如,你可以使用ReportProgress的第二个可选的参数,并在UserState参数

private void BKGWork_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    for (int i = 1; i <= 20; i++) 
    { 
     //do work 
     worker.ReportProgress(i); 
    } 
} 
private void BKGWork_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    // This is the value of the variable i passed above 
    Console.WriteLine(e.ProgressPercentage); 
} 

检索根据您的评论如下,似乎你还没有正确设置事件处理程序,这很容易发现,如果你可以使用调试程序,在ProgressChanged事件中放置一个断点(F9)并运行程序(F5),如果没有命中断点,检查是否有在设计器或代码中正确设置事件处理程序,否则如果命中断点,请查看Visual Studio的输出窗口(在运行时,在NON控制台应用程序中,控制台输出重定向到Visual Studio的输出窗口)

+0

我在控制台上一无所获。完全空白 –

+0

如果您可以使用调试器,则在ProgressChanged事件内的一行中放置一个断点并运行该程序。如果断点未命中,则检查是否在设计器或代码中正确设置了事件处理程序。否则,如果命中断点,那么你不看输出窗口(在运行时,在NON控制台应用程序中,控制台输出被重定向到Visual Studio的输出窗口) – Steve

+0

我还没有声明ProgressChanged的事件处理程序事件。愚蠢的我。谢谢你的头:) –