【问题标题】:Algorithm progress callback算法进度回调
【发布时间】:2013-03-10 21:15:38
【问题描述】:

我必须通过大量迭代、矩阵运算等来实现非常复杂的算法。傅里叶级数逼近有两个主要循环。我想知道实现进度回调的最佳方法是什么。我将来想在 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);
    }
}

【问题讨论】:

  • 进度:操作已完成/待操作
  • 这很清楚。但我要求的是别的东西。使用什么委托、Func 或什么作为算法的参数。这里最好的选择是什么?
  • 您应该能够实现在单独线程上运行的算法并使用BackgroundWorker 及其ProgressChanged 事件更新UI。查看此链接了解更多信息:elegantcode.com/2009/07/03/…
  • 如果这解决了您的问题,或者您需要代码方面的帮助,请告诉我,以便我将其作为答案发布并在需要时添加更多信息。
  • 我喜欢你的评论,因为你指出了一件重要的事情——不要冻结 UI。我认为我会坚持我的 collback 作为 Action 的想法,我认为它是松散耦合的。对于线程,我使用 TPL,因为它比 BackgroundWorker 为我做的更多。

标签: c# wpf callback


【解决方案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;
    }
}

【讨论】:

  • 我不知道Progress&lt;T&gt;。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多