使用哪种算法来计算函数调用的进度?
显然,如果你有一个循环,这很容易做到,比如:
Action<Double> notifier = d => Console.WriteLine("Completed: " + d.ToString());
Double _interval = 0.05;
for (int i = 0; i < 1000; i++)
{
int rem = default(int);
Math.DivRem(i, _interval, out rem);
if (rem == 0)
{
double progress = (double)i / 1000;
notifier(progress);
}
}
但是,当你有一些泛型委托,你想异步运行它,但也通知另一个线程的进度,你不能保证你可以直接使用for循环?其他一些直接的方法可能是:
1)首先对函数进行计时(如果它是一个长时间运行的任务,这对性能非常不利)
2)在日志中存储函数过去的计时并使用它(但这并不一定考虑额外的变量- cpu,内存等在任务的特定时间)
然而,是否存在更先进的算法,即使只是近似的进展?
BackgroundWorker
类有一个更新回调,但在回答你的"通用算法"的问题,寻找完成,不是真的。你能得到的最接近的估计是基于函数长度(http://www.ndepend.com/),这将得到你的代码行长度。
给worker函数传递一个回调委托,并让它向UI报告它的进度。
UI不应该负责"弄清楚要做什么",而应该只是从worker获取更新。
例如: void longRunningFunction(Action<int> updateCallback)
{
// Do something long, but on measurable places, call updateCallback
updateCallback(50);
}
在UI中:
longRunningFunction(x => progressBar.SetProgress(x));
这是一个学术问题吗?
如果没有,您可以选择使用BackgroundWorker
,它有一个内置的ReportProgress
方法
我想你也可以使用。net reflector来看看它的实现,如果你好奇的话