多重実行対策用コマンドを作る。

RelayCommandでは、対応できない連打による多重実行。ボタン押した回数分実行される。CanExecuteを見てくれよ!と言いたいけど、Executeの処理が終わってからチェックするので、正しく次が実行される。どうしようもない。
じゃあ、しょうがないですまないのが仕事なんだよ。締め(ある時点以前のデータを確定させ、編集できなくする)処理なんかを多重実行してほしくない(時間かかるし)。DataBindingには、IsAsyncというプロパティがあるんだけど、これはgetに時間がかかる場合のものらしい。
で、調べた結果、以下の記事を参考に作ることにしたのが、非同期実行型コマンド。
An Asynchronous Delegate Command for your WPF MVVM Apps - AsyncDelegateCommand
ようするに、Executeの実行をバックグラウンドで実行させ、その終了を待たずに、次の処理へ移るわけだ。
そうすることで、ボタンの無効化が発生し、多重実行を防止してくれる。
作ったクラスは上のリンクのクラスに以下の点を加えたもの。

・非同期実行には欠かせない、Dispatcherプロパティを追加します。
・メモリリーク対策として、内部をクリアするメソッド(Clear)メソッドを実装します。
・実行中の処理をキャンセルできても良いな。Cancelメソッドを実装する。
・実行中かどうか(実行可能かどうかではない)を取得するプロパティ(IsExecuting)を追加します。

検索や更新、時間のかかる処理をコマンドで実行させる時は、こっちを使うようにした。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m