报告异步函数调用进度的算法



使用哪种算法来计算函数调用的进度?

显然,如果你有一个循环,这很容易做到,比如:

 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方法

http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

我想你也可以使用。net reflector来看看它的实现,如果你好奇的话

相关内容

  • 没有找到相关文章

最新更新