28

mvvmcross ビューモデルで実行時間の長いプロセスがあり、非同期にしたい ( http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx )。

async キーワードは現在、Xamarin のベータ チャネルでサポートされています。

以下は、現在非同期を実装している方法の例です。IsBusy フラグを UI 要素にバインドして、読み込みメッセージを表示できます。

これは正しい方法ですか?

public class MyModel: MvxViewModel
{
    private readonly IMyService _myService;
    private bool _isBusy;

    public bool IsBusy
    {
        get { return _isBusy; }
        set { _isBusy = value; RaisePropertyChanged(() => IsBusy); ; }
    }

    public ICommand MyCommand
    {
        get
        {
            return new MvxCommand(DoMyCommand);
        }
    }

    public MyModel(IMyService myService)
    {
        _myService = myService;
    }

    public async void DoMyCommand()
    {
        IsBusy = true;
        await Task.Factory.StartNew(() =>
            {
                _myService.LongRunningProcess();
            });
        IsBusy = false;
    }

}
4

4 に答える 4

3

await の周りに最後に try catch を追加することを除いて、問題ないように見えます。

    public async void DoMyCommand()
    {
        IsBusy = true;
        try{
            await Task.Factory.StartNew(() =>
                                        {
                _myService.LongRunningProcess();
            });
        }catch{
            //Log Exception
        }finally{
            IsBusy = false;
        }
    }

さらに、非同期で MvxCommand を使用した例がブログにあります。あなたの例に非常に似ていますhttp://deapsquatter.blogspot.com/2013/03/updating-my-mobile-apps-for-async.html

于 2013-06-19T10:33:09.130 に答える
1

MethodBinding プラグインを使用してボイラー プレート コード (コマンド) を回避し、UI を非同期メソッドに直接バインドすることもできます。

さらに、Fody PropertyChangedを使用すると、コードは次のようになります。

[ImplementPropertyChanged]
public class MyModel: MvxViewModel
{
    private readonly IMyService _myService;

    public bool IsBusy { get; set; }

    public MyModel(IMyService myService)
    {
        _myService = myService;
    }

    public async Task DoSomething()
    {
        IsBusy = true;
        await Task.Factory.StartNew(() =>
        {
                _myService.LongRunningProcess();
        });
        IsBusy = false;
    }
}

「クリック DoSomething」のようなバインディングを作成できます。

一方、 を使用するのではなく、 asyncawait Task.Factory.StartNew()を作成してみませんか? _myService.LongRunningProcessそれははるかに良く見えるでしょう:

public async Task DoSomething()
{
    IsBusy = true;
    await _myService.LongRunningProcess();
    IsBusy = false;
}
于 2016-07-05T19:57:37.740 に答える