Commandを使って非同期メソッドを実行する
WPFやXamarin.FormsなどXAMLを使用するアプリケーションの場合,ビューとロジックを分離するためにCommand
を使ったりします.
一般的な書き方は以下のとおりです.
(注意:RefreshCommand = new Command(ExecuteRefreshCommand);
はthis.BindingContext = this;
よりも前書く必要があります)
//XAML側でバインドするCommandプロパティを用意 public ICommand RefreshCommand { get; } public MainPage() { InitializeComponent(); //このCommandが呼び出されたときに実行するメソッドを指定 RefreshCommand = new Command(ExecuteRefreshCommand); this.BindingContext = this; } //実行されるメソッド private void ExecuteRefreshCommand(object obj) { //何かの処理 }
次は,この実行されるメソッドが非同期メソッドの場合です.
以下のような非同期メソッドを実行したいとします.
private async Task ExecuteRefreshCommand(object obj) { await Task.Delay(2000); }
このとき,RefreshCommand
への登録は以下のようになります.
RefreshCommand = new Command(async (o)=>await ExecuteRefreshCommand(o));
これで非同期メソッドが呼び出され,CommandParameterも渡されます.
もう一つの書き方.
上の例ではExecuteRefreshCommand
メソッドを作成して,それを呼び出していますが,これをLambda式だけで書く場合は以下のようになる.
//RefreshCommand = new Command(async (o) => await ExecuteRefreshCommand(o)); RefreshCommand = new Command(async (o) => { await Task.Delay(2000); People.Clear(); People = GeneratePeople(DateTime.Now.ToString()); //ぐるぐるを非表示にする IsRefreshing = false; });