私はWindows Phone 8 MVVMプロジェクトでasync/awaitを使いたいのですが、私はこのapiを使ってICommandsを実装する良い方法を見つけるのに苦労しています。 私はこの件についていくつかの記事を読んできましたが、私は非同期のボイドを避けなければならないという下記のMSDNのこの記事にぶつかっています: http://msdn.microsoft.com/en-us/magazine/jj991977.aspx 別の質問で、私は非同期ボイドを使用すべきではないと言った人もいました。イベントでない限り。async/MVVMで待たずにvoidメソッド
しかし、問題は、私がインターネット上で見つけることができるすべての例が非同期ボイドを使用していることです。私が見つけた この2品は例です: http://richnewman.wordpress.com/2012/12/03/tutorial-asynchronous-programming-async-and-await-for-beginners/と http://blog.mycupof.net/2012/08/23/mvvm-asyncdelegatecommand-what-asyncawait-can-do-for-uidevelopment/
最後のものは/待って非同期を使用してのICommandの実装ですが、それはまた、非同期空隙を使用しています。 私はこのための解決策を考え出すしようとしているので、私は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を使用するいくつかの光を与えることができますか?参照記事で
私はあなたのlibと実装を見ています。 Windows Phone App.xamlで未処理の例外イベントを発生させた場合に例外が発生した場合は、ここに入れたブログ記事のICommand実装で何かを教えてください。 私は後でそれをテストします。 –
私は 'SimpleAsyncCommand'を見ていました。私の目的のために働くように見えます。私は' ExecuteAsync'が呼び出す予定の私のメソッドをUIのコンテキストで実行しています。このメソッド内で 'await Task.Run'を使用してください。このように動作する例外は失われますか?もしそうでなければ、私はあなたのライブラリーを使うつもりだと思う! –
WP UIで 'ICommand'の例外が発生するので、' Application.UnhandledException'に送られます。 'ExecuteAsync'がUIスレッドで実行されます(つまり、' async'デリゲートはUIスレッド上で実行されます)。あなたは 'await Task.Run'コマンドを実行することができます。非同期の作業がある場合は、 'Task.Run'は必要なく、単に' await'を使うことができます。それは実際に私のlibの一部ではありません。今のところソースをコピーするだけです。 –