我必须用很多迭代,矩阵运算等来实现非常复杂的算法。傅立叶级数近似有两个主要的循环。我想知道实现进度回调的最佳方法是什么。我将来我想在WPF应用程序中使用此算法,我想实现进度条。如何准备算法以便将来轻松实现进度条?
我正在考虑这样的事情:
static void Main(string[] args)
{
Console.Write("Progres... ");
Alg((i) => UpdateProgress(i));
}
public static void UpdateProgress(int iteration)
{
string anim = @"|/-\-";
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
Console.Write(anim[iteration%5]);
}
public static void Alg(Action<int> progressCallback)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(50);
progressCallback(i);
}
}
答案 0 :(得分:1)
如果您更喜欢使用TPL
,为什么不坚持使用它?
您可以使用“IProgress”http://msdn.microsoft.com/pl-pl/library/hh193692.aspx。
class Program
{
static void Main(string[] args)
{
Console.Write("Progres... ");
Progress<int> progress = new Progress<int>();
var task = Alg(progress);
progress.ProgressChanged += (s, i) => { UpdateProgress(i); };
task.Start();
task.Wait();
}
public static void UpdateProgress(int iteration)
{
string anim = @"|/-\-";
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
Console.Write(anim[iteration % anim.Count()]);
}
public static Task Alg(IProgress<int> progress)
{
Task t = new Task
(
() =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(50);
((IProgress<int>)progress).Report(i);
}
}
);
return t;
}
}
答案 1 :(得分:0)
您需要实现接口INotifyPropertChanged的对象。表示进度状态的此对象的属性将绑定到可视化该进度状态的XAML元素(Progressbar)。在您的算法中,您只需将此属性设置为适当的值。您的算法可以将此对象作为参数。或者,您可以在委托中设置此属性,该属性将提供给您算法。如果您正在使用多个线程,WPF会负责将属性更改传递给UI线程。