2013-03-10 86 views
2

我必须用很多迭代,矩阵运算等来实现非常复杂的算法。傅里叶级数近似有两个主循环。我想知道什么是实施进度回调的最佳方法。我未来我想在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

进度:操作完成/要运行的操作 – 2013-03-10 21:19:54

+0

这很明显。但我正在寻求别的东西。什么使用委托,Func或什么作为算法的参数。这里最好的选择是什么? – 2013-03-10 21:31:48

+1

您应该能够实现在单独线程上运行的算法,并使用'BackgroundWorker'及其'ProgressChanged'事件更新UI。看看这个链接了解更多信息:http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/。 – 2013-03-10 22:07:21

回答

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; 
    } 
} 
+0

我不知道'Progress '。谢谢! – 2013-03-27 15:06:16

0

你需要它实现接口INotifyPropertChanged对象。表示进度状态的此对象的属性将绑定到可视化进度状态(Progressbar)的XAML元素。在你的算法中,你只需要将这个属性设置为合适的值即可。你的算法可以得到这个对象作为参数。或者,您可以在提供给您的算法的委托中设置此属性。如果您正在使用多个线程,WPF会注意将属性更改提供给UI线程。