RyeGuy
RyeGuy

Reputation: 4483

await operator not stopping continuation of other method calls

I have three methods that look like below

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;
}

I would like the execution of the first two methods to complete before calling the third. I have researched the issue and have found ways of doing so using the await operator and Wait() method. However my implementations has not worked. Here is my code below.

Attempt 1

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

Attempt 2

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

Any suggestions on how to get this to work?

Upvotes: 0

Views: 196

Answers (2)

Anthony T.
Anthony T.

Reputation: 268

To get a third method to be executed based on the completion of two other methods you use the WhenAll method of the Task class.

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

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

Upvotes: 4

RyeGuy
RyeGuy

Reputation: 4483

@Yacoub Massad and @SLaks reminded me that in order for await to work on a method call, the method needs to contain an await operator.

So I changed my PhotoLibraryAccess method to contain an await operator and placed its method call right before the DisplayAppBar call.

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

And then ...

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

Upvotes: 1

Related Questions