await运算符不会停止继续其他方法调用

时间:2017-11-07 22:16:07

标签: c# multithreading async-await wait

我有三种方法,如下所示

private async Task checkPhotoLibraryAccess()
{
    PHPhotoLibrary.RequestAuthorization(status =>
    {
        switch (status)
        {
            //stuff here
        }
    }

}

private async Task checkDeviceAuthorizationStatus()
{
    var status = AVCaptureDevice.GetAuthorizationStatus(AVMediaType.Video);
    switch (status)
    {
        //stuff here
    }
}

private void displayAppBar()
{
     AppBar.IsVisible = true;
}

我希望在调用第三个方法之前完成前两个方法的执行。我已经研究过这个问题,并且已经找到了使用await运算符和Wait()方法的方法。但是我的实现没有奏效。以下是我的代码。

尝试1

private async void MyMethod() 
{
    await checkPhotoLibraryAccess();
    await checkDeviceAuthorizationStatus();
    displayAppBar(); //THIS IS CALLED BEFORE COMPLETION OF TWO ABOVE
}

尝试2

private async void MyMethod()
{
    checkPhotoLibraryAccess().Wait();
    checkDeviceAuthorizationStatus().Wait();
    displayAppBar(); //SAME ISSUE
}

有关如何使其发挥作用的任何建议吗?

2 个答案:

答案 0 :(得分:4)

要根据其他两种方法的完成情况获得第三种方法,请使用WhenAll类的Task方法。

var t1 = CheckPhotoLibraryAccess();
var t2 = CheckDeviceAuthorization();

await Task.WhenAll(t1, t2).ContinueWith(t => DisplayAppBar());

答案 1 :(得分:1)

@Yacoub Massad和@SLaks提醒我,为了等待处理方法调用,该方法需要包含一个await运算符。

因此,我将PhotoLibraryAccess方法更改为包含await运算符,并在DisplayAppBar调用之前将其方法调用放在正确位置。

private async Task checkPhotoLibraryAccess()
{
    var status = await PHPhotoLibrary.RequestAuthorizationAsync(); 
    //stuff here
}

然后......

private async void MyMethod()
{
     checkDeviceAuthorizationStatus(); //Removed async Task stuff
     await checkPhotoLibraryAccess();
     displayButtons(); //IT WORKS
}