我们得到了一个长时间运行的作业,它需要一个作业详细信息列表并且不共享任何状态,试图在 WPF MVVM .Net 4 项目中运行。看来任务并行库将是最佳选择,因为它在后台线程上运行并允许并行处理。我创建了一个原型应用程序,它也将 MVVM-Light 用于 RelayCommands。示例“aTplTest.7z”位于https://skydrive.live.com/redir?resid=DA3E430C1A5F3B81!186&authkey=!AOOWYGbB_PToC5A
原型主要工作(只是运行斐波那契计算进行测试),除了以下内容。
- 如何将视图显示为对话框并让它自动启动长时间运行的进程?(目前的工作是让用户按下开始按钮。)
- 在取消当前作业实例时,如何允许用户关闭视图并且不让任务创建异常?
(例如,如果用户按下视图关闭窗口按钮,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;
}
我将使用任何解决方案更新这篇文章和源示例。