Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在方法工作时填充进度条_C#_Backgroundworker - Fatal编程技术网

C#在方法工作时填充进度条

C#在方法工作时填充进度条,c#,backgroundworker,C#,Backgroundworker,我正在构建一个加载时间很长的小应用程序 我想在progressbar中显示此加载时间,以查看加载程序之前需要等待多长时间 我希望你明白我想要什么 我已经试过backgroundworker,但不知道如何使用它,在他们在嫁妆活动中使用的每个例子中,都是一个简单的例子 for (int i = 0; i < 100; i++) { //method etc here backgroundWorker.ReportProgress(i); } for(int i=0;i=2) {App

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

我想在progressbar中显示此加载时间,以查看加载程序之前需要等待多长时间

我希望你明白我想要什么

我已经试过backgroundworker,但不知道如何使用它,在他们在嫁妆活动中使用的每个例子中,都是一个简单的例子

    for (int i = 0; i < 100; i++)
{
//method etc here
backgroundWorker.ReportProgress(i);
}
for(int i=0;i<100;i++)
{
//方法等
后台工作人员报告进度(一);
}

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

提前谢谢你

编辑:

private void backgroundWorker\u DoWork(对象发送方,DoWorkEventArgs e)
{
Aktie DATAKTIE=新Aktie(aktien_名称);
对于(int i=0;i<100;i++)
{
dataAktie.ReadFromDatabase();
dataAktie.FetchData();
后台工作人员报告进度(一);
}
}
private void backgroundWorker_ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
progressBar1.值=e.ProgressPercentage;
}
私有void backgroundWorker_RunWorkerCompleted(对象发送方,runworkercompletedeventarge)
{
//必须填写的控件
}

但是此控件不会将数据im veryyyyy混淆

下面的代码示例演示如何使用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!");
}
private void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
//此方法将在UI线程以外的线程上运行。
//确保不要操纵创建的任何Windows窗体控件
//在UI线程上使用此方法。
backgroundWorker.ReportProgress(0,“正在工作…”);
十进制lastlast=0;
小数点后=1;
十进制电流;
如果(requestedCount>=1)
{AppendNumber(0);}
如果(requestedCount>=2)
{AppendNumber(1);}
对于(int i=2;i

**A
BackgroundWorker
和它的
ReportProgress
方法并不是简单地向你展示你想要的任何进展的魔杖,你实际上必须改变你的代码才能做到这一点

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

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

dataAktie.ReadFromDatabase();
backgroundWorker.ReportProgress(50); // 50% done
dataAktie.FetchData(); 
backgroundWorker.ReportProgress(100); // 100% done

显然,这并不完美。获得更准确进度的唯一方法是更改
ReadFromDatabase
FetchData
方法,例如,让它们将
BackgroundWorker
对象作为参数,以便它们也可以报告进度,或为此提供回调。

添加一个进度更改事件-我已经使用过了,我的意思是,如果没有此事件,它将无法工作,但它只向progressbar报告进度,但这不是我的问题。“因为这只会重复我的方法…”:不,整个for循环是你的方法。在您的方法中,您必须调用ReportProgress,因为这是实际估计它的唯一方法。您需要从应用程序中的代码调用ReportProgress,这会导致“加载时间过长”。如果是从数据库中提取数据,或者初始化其他内容,则需要一种将进度传递到progressbar的方法。如果您无法控制导致延迟的代码,您可以将progressbar的样式设置为“Marquee”。我不知道我是否不理解您的答案,或者您是否不理解我的问题,但这是我在DoWork中已有的代码谢谢!这就是我想知道的!它真的不像你说的那么完美,但是我如何将backgroundworker作为参数呢?@Coder64例如,你必须将
void ReadFromDatabase()
更改为
void ReadFromDatabase(backgroundworker-worker)
,然后你可以在该方法内调用
worker.ReportProgress
。但这将是一个突破性的变化,可能不是最好的解决方案。只有在这种方法中,你才能更准确地预测进度,好吧,我会试试。非常感谢。
dataAktie.ReadFromDatabase();
backgroundWorker.ReportProgress(50); // 50% done
dataAktie.FetchData(); 
backgroundWorker.ReportProgress(100); // 100% done