我想异步运行一个动作,并使用点报告动作所花费的时间(对于每个季度,在文本框中添加一个新点)。这是我到目前为止所拥有的。
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方法。我不确定在哪里调用它,以及在其中放入什么参数。任何人都可以帮助我吗?
答案 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
完全可行。