1

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

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

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

(例如,如果用户按下视图关闭窗口按钮,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;
    }

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

4

2 回答 2

1

要自动启动长时间运行的进程,只需将以下 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);
    }
}
于 2012-10-23T18:08:40.277 回答
0

不完全确定您要问的所有细节,但我可以尝试解决这两个问题。

  1. 将视图显示为对话框:您的意思是这是一个模态对话框吗?如果视图是从 Window 派生的(我假设这不会太容易),只需调用 view.ShowDialog();
    至于启动长时间运行的进程,要么附加到 OnLoaded,要么在构造函数中运行。

  2. 注册一种关闭视图的方法,包括在循环选项上使用取消令牌。在 Build Voucher 中,只需检查取消令牌是否已请求取消,然后优雅地停止生成消息并进行清理。

我希望这有帮助。如果您添加评论,我可能会更清楚。

于 2012-10-23T16:55:16.383 回答