Windows Phone 8 MVVM プロジェクトで async/await を使用したいのですが、この API を使用して ICommands を実装する良い方法を見つけるのに苦労しています。この件に関するいくつかの記事を読んでいて、以下の MSDN からこの記事に出くわしました。この記事では、未処理の例外をキャッチするのが難しくなるため、async void を避ける必要があると述べています: http://msdn.microsoft.com/en -us/magazine/jj991977.aspx この件について別の質問をしたところ、誰かが async void を使うべきではないと言いました。イベントがなければ。
しかし、問題は、インターネットで見つけることができるすべての例が async void を使用していることです。私が見つけたこの 2 つの 記事は例です 。 /2012/08/23/mvvm-asyncdelegatecommand-what-asyncawait-can-do-for-uidevelopment/
最後の 1 つは、async/await を使用した ICommand の実装ですが、async void も使用しています。私はこれに対する解決策を見つけようとしているので、RelayCommand に基づいて ICommand のこの実装を作成しました。
public delegate Task AsyncAction();
public class RelayCommandAsync : ICommand
{
private AsyncAction _handler;
public RelayCommandAsync(AsyncAction handler)
{
_handler = handler;
}
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
if (value != _isEnabled)
{
_isEnabled = value;
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}
public bool CanExecute(object parameter)
{
return IsEnabled;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
ExecuteAsync();
}
private Task ExecuteAsync()
{
return _handler();
}
}
そして、私はそれを次のように使用しようとしています:コンストラクターで:
saveCommand = new RelayCommandAsync(SaveSourceAsync);
それから:
private async Task SaveSourceAsync()
{
await Task.Run(() => { Save(); });
}
private void Save()
{
// Slow operation
}
問題は、どれが最適で最適なのかがわからないため、これと他の実装に慣れていないことです。
できればMVVMを使用して、それをどのように使用する必要があるかについて、誰かが光を当てることができますか?