++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

非同期コマンド対(開始/キャンセル)

with one comment

こんなもの作ってみた。

以下のような処理があまりにも毎度定型句なので、ちょっと補助クラス1個作ってみた。

  • [開始]ボタン押して非同期処理を開始
    • と同時に[開始]ボタンをdisable
    • [キャンセル]ボタンをenable
  • [キャンセル]ボタンを押せば実行停止
  • 停止(自然停止、キャンセル問わず)後、ボタンのenable/disableを元に戻す

以下のような感じで ViewModel 書いて、

public class ProgressValue
{
    public int Percentage { getset; }
    public string Value { getset; }
}

AsyncCommandPair<doubleProgressValue> _run;

public IAsyncCommandPair Run
{
    get
    {
        if (_run == null)
        {
            _run = new AsyncCommandPair<doubleProgressValue>(
                () =>
                {
                    CurrentValue = 開始;
                },
                async (x, progress, cancel) =>
                {
                    //todo: 
本来はこの辺りでモデルのコードを呼び出す。
                    // 今回はデモということで、1秒おきに値を更新するだけ。

                    for (int i = 1; i <= 10; i++)
                    {
                        await TaskEx.Delay(1000);
                        progress.Report(new ProgressValue
                        {
                            Percentage = i * 10,
                            Value = (x * i).ToString(),
                        });

                        if (cancel.IsCancellationRequested) return;
                    }
                },
                async () =>
                {
                    // 1秒後にプログレスバーとかの状態をリセット。
                    CurrentValue = 完了;
                    await TaskEx.Delay(1000);
                    CurrentValue = string.Empty;
                    ProgressPercentage = 0;
                },
                x => true,
                x =>
                {
                    ProgressPercentage = x.Percentage;
                    CurrentValue = x.Value;
                }
                );
        }
        return _run;
    }
}

以下のような感じでコマンドをバインディング。

<Button
 Content=”
開始
  Command=”{Binding Run.StartCommand}”
 CommandParameter=”{Binding ElementName=InitialValue, Path=Value}”
 />
<Button
 Content=”
キャンセル
 Command=”{Binding Run.CancelCommand}”
/>

Written by ufcpp

2011年2月22日 @ 15:40

カテゴリー: C#

コメント / トラックバック1件

Subscribe to comments with RSS.

  1. 非同期コマンドについての記事で使わせてもらいました。大変参考になりました。
    http://d.hatena.ne.jp/taguo/20110710

    taguo

    2011年7月10日 at 16:48


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。