c# - 如何在 mvvmcross View 模型中使用异步?

标签 c# async-await xamarin mvvmcross

我在 mvvmcross View 模型中有一个长时间运行的进程,并希望使其异步(http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx)。

Xamarin 的 Beta channel 目前支持 async 关键字。

下面是我目前如何实现异步的示例。 IsBusy 标志可以绑定(bind)到 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;
    }

}

最佳答案

你应该避免async void。当您处理 ICommand 时,您确实需要使用 async void,但它的范围应该最小化。

此修改后的代码将您的操作公开为 async Task,它可以从您代码的其他部分进行单元测试和使用:

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(async () => await DoMyCommand());
    }
  }

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

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

您对 IsBusy 的使用没问题;这是异步 UI 中的一种常见方法。

我确实将 Task.Factory.StartNew 更改为 Task.RunTask.Runasync 代码中首选 reasons described by Stephen Toub .

关于c# - 如何在 mvvmcross View 模型中使用异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187113/

相关文章:

c# - WCF 和 Entity Framework 和 SQL Server - "The underlying provider failed on Open"

c# - 在 C# 中从模型自动生成好友类

c# - 为什么异步客户端 TCP 操作的性能似乎比同步 TCP 操作差?

ios - 如何获取 Google Maps API iOS 中某个点的坐标?

ios - 窗口没有填满整个屏幕

c# - 在字符串数组中找到最长的子字符串,并将其从数组中的所有元素中删除

c# - c++/cli 中的委托(delegate)方差

c# - 使用await时读取文本文件和代码跳转

c# - 将任务作为参数传递

c# - XA5302 : Two process may be building this project at once, Xamarin Visual Studio