7

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を使用して、それをどのように使用する必要があるかについて、誰かが光を当てることができますか?

4

1 に答える 1