报告行动进展情况

时间:2014-05-15 14:25:07

标签: c# winforms

我想异步运行一个动作,并使用点报告动作所花费的时间(对于每个季度,在文本框中添加一个新点)。这是我到目前为止所拥有的。

private void ReportAction(string label, Action action)
{
    BackgroundWorker worker = new BackgroundWorker();

    worker.WorkerSupportsCancellation = false;
    worker.WorkerReportsProgress = true;

    worker.DoWork += new DoWorkEventHandler((object sender, DoWorkEventArgs e) =>
    {
        action();
    });

    worker.ProgressChanged += new ProgressChangedEventHandler(this.OnProgressChanged);

    this.LogTextBox.AppendText(label);

    worker.RunWorkerAsync();
}

private void OnProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if (e.ProgressPercentage % 25 == 0)
    {
        this.LogTextBox.AppendText(" .");
    }
}

正如您所看到的,它为操作初始化了一个新的BackgroundWorker,写了"标签"到文本框文本,然后检查进度是否为四分之一,如果是,则添加一个点。输出最终将如此:

Initializing SomeMethod . . . .

每个季度完成后,每个点都会出现。

但是,我面临的问题是BackgroundWorker类的ReportProgress方法。我不确定在哪里调用它,以及在其中放入什么参数。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

您应该将后台工作人员传递给Action

private void ReportAction(string label, Action<BackgroundWorker> action)
{
    BackgroundWorker worker = new BackgroundWorker();

    worker.WorkerSupportsCancellation = false;
    worker.WorkerReportsProgress = true;

    worker.DoWork += new DoWorkEventHandler((object sender, DoWorkEventArgs e) =>
    {
        action(worker);
    });

    worker.ProgressChanged += new ProgressChangedEventHandler(this.OnProgressChanged);

    this.LogTextBox.AppendText(label);

    worker.RunWorkerAsync();
}

private void OnProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if (e.ProgressPercentage % 25 == 0)
    {
        this.LogTextBox.AppendText(" .");
    }
}

在您的操作中,您现在可以报告进度:

private void actionDelegate(BackgroundWorker bgw)
{
    bgw.ReportProgress(50);
}

您也可以通过提供一个为您执行此操作的界面来减少对BackgroundWorker的依赖。

答案 1 :(得分:1)

  

但是,我面临的问题是BackgroundWorker类的ReportProgress方法。我不确定在哪里调用它,以及在其中放入什么参数。任何人都可以帮助我吗?

你可以在action();中称之为工作的方法。

E.g

public void action()
{
     //do some work
     worker.ReportProgress(percentValue); 
}

ReportProgress()可以将int百分比值或百分比和对象传递给您的OnProgressChanged事件。

答案 2 :(得分:0)

  

我不确定在哪里调用它,以及在其中放入什么参数。

来自MSDN

  

如果需要后台操作来报告其进度,可以调用ReportProgress方法来引发ProgressChanged事件。 WorkerReportsProgress属性值必须为true,否则ReportProgress将抛出InvalidOperationException。

     

您可以实施一种有意义的方法来衡量后台操作的进度,占完成总任务的百分比。

从您所显示的内容中,来电将会在action()

通常情况下,你会加入某种&#34;%完成&#34;值 - 如果您正在循环访问某个集合,请衡量已处理的总数中有多少项。

作为旁注,我不会使用e.ProgressPercentage % 25作为衡量标准,因为百分比从26跳到27完全可行。