在下面的示例中,app是应用程序中的ViewModel的一部分(Xamarin.Android,Xamarin.iOS和Windows Phone 8.1 RT)。我有一个名为IsLoading
的属性,指示是否正在加载某些内容。然后我在我的视图中绑定了一个显示加载指示符的属性。下面的方法由在调用ViewModel的构造函数时执行的命令触发。
该方法继续而不等待内部任务完成。加载指示器应至少显示5秒,但IsLoading
属性在设置为true后立即设置为false。
这种情况发生在所有平台上。
public class ExampleViewModel: ViewModelBase
{
private bool _isLoading;
public bool IsLoading
{
get { return _isLoading; }
set { Set(ref _isLoading, value); }
}
private RelayCommand _loadCommand;
public RelayCommand LoadCommand => _loadCommand ?? (_loadCommand = new RelayCommand(async () => await LoadSomething()));
public ExampleViewModel()
{
LoadCommand.Execute(null);
}
private async Task LoadSomething()
{
if (IsLoading)
{
return;
}
IsLoading = true;
try
{
await Task.Delay(5000);
}
catch (SomeException exc)
{
// handle exceptions
}
finally
{
IsLoading = false;
}
}
}
ViewModel本身在每个平台的视图中实例化(使用IoC,Autofac)。
答案 0 :(得分:1)
我认为你误解了async await的作用。您实际上是异步运行线程https://msdn.microsoft.com/en-us/library/hh191443.aspx。如果你处于调试模式,线程将继续运行,这就是你注意到线程没有等待延迟的原因。