FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

コマンドクラスのリメイク(四)

コマンドクラスのリメイク(壱)
コマンドクラスのリメイク(弐)
コマンドクラスのリメイク(参)
の続き

・同期型コマンドクラス
短時間で終わる処理に向いている。非同期より構造が簡単なので処理は速い(と思う)。
〇クラス宣言
/// <summary>
/// 同期型コマンド用クラス
/// </summary>
public class DelegateCommand : CommandExBase {

〇実行メソッド
/// <summary>
/// コマンド実行
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
protected override void ExecuteProtected(object parameter) {
try {
if (!this.NeedSync) {
//Dispatcher.Invokeを使うと、むしろエラーになる時の回避策
this.ExecuteAction(parameter);
} else if (this.Dispatcher.Thread == System.Threading.Thread.CurrentThread) {
this.ExecuteAction(parameter);
} else {
this.Dispatcher.Invoke(this.ExecuteAction, this.Priority, parameter);
}

//先にフラグをOFF
this.NowExecuting = false;
//実行完了後のアクション
this.CompletedExecuteAction?.Invoke(this, null);

} catch (Exception ex) {
//先にフラグをOFF
this.NowExecuting = false;
//実行完了後のアクション
this.CompletedExecuteAction?.Invoke(this, ex);
}

return;
}
CompletedExecuteActionを呼び出す前にNowExecutingをfalseにしないと、CanExecute再評価で困る事になる。

・Awaitableなクラス
非同期型コマンドクラス内で、Awaitableパターンを使ってみたくなったので、先にこっちを実装する。
非同期メソッド入門 (9) - Awaitableパターンの自前実装
を参考に実装。コピペはシテナイヨ?

・非同期型コマンドクラス
抽象クラスで実装している分、非同期型コマンドの実装も、そこまで多くない。
〇クラス宣言
/// <summary>
/// 非同期型コマンド用クラス
/// </summary>
public class AsyncDelegateCommand : CommandExBase {

〇実行メソッド
/// <summary>
/// 非同期でコマンド実行
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
protected override void ExecuteProtected(object parameter) {
//非同期で実行します。
this.RunAsync(parameter);
}
RunAsyncメソッドをasync/awaitで非同期的に実行する。
〇RunAsync メソッド
/// <summary>
/// 非同期で実行します。
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
private async void RunAsync(object parameter) {

Func<bool> execute = () => {
this.ExecuteAction(parameter);
parameter = null;
return true;
};

try {
var result = await Awaitable<bool>.Run(execute).
ContinueWith(awaitable => {
this.NowExecuting = false;
this.CompletedExecuteAction?.Invoke(this, awaitable.Status);
execute = null;
});

} catch (Exception ex) {
this.Exception = ex;
}

return;
}
・AwaitableのGenericTypeをboolにしているのは、適当。
・例外をキャッチして、Exceptionプロパティに設定している。CompletedExecuteAction内で参照可能。
async/awaitを使いたかったんだよーってことで。仕事ではBackgroundWorkerで実装している。確かにこちらがシンプルかなと。仕事で使ってるクラスは、使い続けながら改良を重ねたやつなので、信頼性はあっちが上だけど。
試しに使ってみるか。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。