方法继续而不等待任务

时间:2016-03-01 15:39:13

标签: c# task-parallel-library

上下文

在下面的示例中,app是应用程序中的ViewModel的一部分(Xamarin.Android,Xamarin.iOS和Windows Phone 8.1 RT)。我有一个名为IsLoading的属性,指示是否正在加载某些内容。然后我在我的视图中绑定了一个显示加载指示符的属性。下面的方法由在调用ViewModel的构造函数时执行的命令触发。

问题

该方法继续而不等待内部任务完成。加载指示器应至少显示5秒,但IsLoading属性在设置为true后立即设置为false。 这种情况发生在所有平台上。

示例代码(使用MVVM Light)

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)。

1 个答案:

答案 0 :(得分:1)

我认为你误解了async await的作用。您实际上是异步运行线程https://msdn.microsoft.com/en-us/library/hh191443.aspx。如果你处于调试模式,线程将继续运行,这就是你注意到线程没有等待延迟的原因。