.net - TPL WPF MVVM 如何使其工作?

标签 .net wpf mvvm task-parallel-library mvvm-light

我们得到了一个长时间运行的作业,它需要一个作业详细信息列表并且不共享任何状态,试图在 WPF MVVM .Net 4 项目中运行。看来任务并行库将是最佳选择,因为它在后台线程上运行并允许并行处理。我创建了一个原型(prototype)应用程序,它也将 MVVM-Light 用于 RelayCommands。示例“aTplTest.7z”位于 https://skydrive.live.com/redir?resid=DA3E430C1A5F3B81!186&authkey=!AOOWYGbB_PToC5A

原型(prototype)主要工作(只是运行斐波那契计算进行测试),除了以下内容。

  • 如何将 View 显示为对话框并让它自动启动长时间运行的进程? (目前的工作是让用户按下开始按钮。)
  • 在取消当前作业实例时,如何允许用户关闭 View 并且不让任务创建异常?

  • (例如,如果用户按下 View 关闭窗口按钮,catch 的 Invoke 方法会创建另一个异常。)
        private bool CreateVouchers(int[] workList)
        {
            var loopOptions = new ParallelOptions();
            loopOptions.CancellationToken = TokenSource.Token;
            var success = false;
            try
            {
                Parallel.ForEach(workList, loopOptions, t => BuildVoucher(t));
                success = true;
            }
            catch (OperationCanceledException)
            {
                var scm = new Action(ShowCancellationMessage);
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, scm);
            }
            return success;
        }
    

    我将使用任何解决方案更新这篇文章和源示例。

    最佳答案

    要自动启动长时间运行的进程,只需将以下 Window_Loaded 处理程序添加到您定义 Window_Closing 处理程序的代码隐藏中:

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        var viewModel = (VoucherBuilderViewModel)this.DataContext;
        viewModel.CancelCommand.Execute(null);
    }
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        var viewModel = (VoucherBuilderViewModel)this.DataContext;
        viewModel.RunJob();
    }
    

    当然,不要忘记在 XAML 中注册事件处理程序:
    <Window Closing="Window_Closing" Loaded="Window_Loaded">
    

    并且要在关闭窗口时摆脱异常,只需添加以下空检查:
    catch (OperationCanceledException)
    {
        if (Application.Current != null)
        {
            var scm = new Action(ShowCancellationMessage);
            Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, scm);
        }
    }
    

    关于.net - TPL WPF MVVM 如何使其工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13005755/

    相关文章:

    c# - LogParser 在 C# 中崩溃且没有错误

    c# - .NET 中的单元测试和 UI 测试

    c# - .NET Web 服务无法生成临时类

    c# - 如何不打开相同的 Popup WPF MVVM?

    android - 就单元测试而言,Android 的 MVP 或 MVVM?

    c# - Clean Architecture 中的用户实体

    c# - 升级 .NET 版本后,TwoWay 或 OneWayToSource 绑定(bind)无法对只读属性起作用

    c# - 拖放元素的位置 (MouseDragElementBehavior)

    java - Android mvvm架构难以理解流程

    wpf - 标题未显示在 WPF ListView 中