我在 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.Run
; Task.Run
在 async
代码中首选 reasons described by Stephen Toub .
关于c# - 如何在 mvvmcross View 模型中使用异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187113/