方法工作时C#Progressbar填充

时间:2014-08-20 10:04:15

标签: c# backgroundworker

我正在构建一个加载时间很长的小应用程序。

我想在进度条中显示此加载时间,看看我需要等多久才能加载程序。

我希望你明白我想要的......

我已经尝试了背景工作但不明白如何使用它,在他们在DoWork事件中使用的每个例子中都很简单

    for (int i = 0; i < 100; i++)
{
//method etc here
backgroundWorker.ReportProgress(i);
}

但在我看来,这对我来说毫无意义,因为这只会重复我的方法......

提前谢谢!

编辑:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Aktie dataAktie = new Aktie(aktien_name);

            for (int i = 0; i < 100; i++)
            {

                    dataAktie.ReadFromDatabase();
                    dataAktie.FetchData();             
                    backgroundWorker.ReportProgress(i);
              }
            }


        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
//Controls that have to be filled
}

但是这个控件不会让数据非常混乱

2 个答案:

答案 0 :(得分:1)

以下代码示例演示如何使用ReportProgress方法向用户报告异步操作的进度。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // This method will run on a thread other than the UI thread. 
    // Be sure not to manipulate any Windows Forms controls created 
    // on the UI thread from this method.
    backgroundWorker.ReportProgress(0, "Working...");
    Decimal lastlast = 0;
    Decimal last = 1;
    Decimal current;
    if (requestedCount >= 1)
    { AppendNumber(0); }
    if (requestedCount >= 2)
    { AppendNumber(1); }
    for (int i = 2; i < requestedCount; ++i)
    {
        // Calculate the number. 
        checked { current = lastlast + last; }
        // Introduce some delay to simulate a more complicated calculation.
        System.Threading.Thread.Sleep(100);
        AppendNumber(current);
        backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working...");
        // Get ready for the next iteration.
        lastlast = last;
        last = current;
    }


    backgroundWorker.ReportProgress(100, "Complete!");
}

** http://msdn.microsoft.com/en-us/library/a3zbdb1t%28v=vs.110%29.aspx

答案 1 :(得分:1)

BackgroundWorker并且它的ReportProgress方法不是魔术小说,它只是向您显示您想要的任何进展,您实际上必须更改您的代码才能这样做。

DoWork事件处理程序应包含您要在后台执行的代码。理想情况下,这是可以轻松衡量进步的东西。例如,如果您必须处理10个项目,那么在每个项目之后您可以说我现在已经完成10%。这就是示例代码包含for循环的原因。

您的代码只包含两个方法调用,ReadFromDatabaseFetchData。所以你可以简单地做

dataAktie.ReadFromDatabase();
backgroundWorker.ReportProgress(50); // 50% done
dataAktie.FetchData(); 
backgroundWorker.ReportProgress(100); // 100% done
显然不是很完美。获得更准确进度的唯一方法是更改​​ReadFromDatabaseFetchData方法,例如让他们将BackgroundWorker对象作为参数,以便他们也可以报告进度或提供回调。