ジョブの詳細リストを取得し、WPF MVVM .Net 4 プロジェクトで実行しようとしている状態を共有しない長時間実行ジョブを取得しました。バックグラウンド スレッドで実行され、並列処理が可能であるため、Task Parallel Library が最適な選択肢のようです。RelayCommands にも MVVM-Light を使用するプロトタイプ アプリを作成しました。例の「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;
}
この投稿とソースの例を更新して、解決策を示します。