Skip to content

Synchronous Programming

SameerK-MSFT edited this page Aug 13, 2021 · 7 revisions

Overview

It is strongly recommended to use async programming practices for better performance and responsive apps. However, some legacy apps cannot use asynchronous programming.

MSAL dotnet is based on Task based Asynchronous Pattern (TAP). This page provides links to guidance about how to use async methods in a synchronous way. This has no one solution that fits all. So various best practices are recommended.

Asynchronous programming

If you are not familiar with asynchronous programming, this article will get you familiarized with it.

Asynchronous programming with async and await

You can check for courses on linkedin: Advanced Programming in C#

Calling Asynchronous methods from Synchronous code

There are several ways to run asynchronous code from a synchronous code. Various links are listed here.

Task Run Synchronously

            var getAcctsTasks = PCA.RemoveAsync(acct);
            // there is no timeout for RunSynchronously
            if (!getAcctsTasks.IsCompleted)
            {
                getAcctsTasks.RunSynchronously();
            }

Waits for task to complete

            // wait can optionally have timeout, and cancellation token (not shown)
            int timeoutMilliSec = 3000;
            PCA.RemoveAsync(acct).Wait(timeoutMilliSec);

Wait to get result

            var authResult = PCA.AcquireTokenSilent(Scopes, acct).ExecuteAsync().Result;
            return authResult;

If you need to run multiple tasks at a time prior to wrapping them, it may be useful to take a look at this one. Consuming the Task-based Asynchronous Pattern

Watch out for exceptions and deadlocks.

Here is how to catch exceptions and prevent deadlocks .ConfigureAwait(false)

            try
            {
                Console.WriteLine("Pre AcquireTokenInteractive");
                // Run with wait command
                // create the builder
                var builder = PCA.AcquireTokenInteractive(Scopes);

                // run it interactively.
                // make sure to have ConfigureAwait(false) to avoid any potential deadlocks
                var authResult = builder.ExecuteAsync()
                                        .ConfigureAwait(false)
                                        .GetAwaiter()
                                        .GetResult();
                Console.WriteLine("Post AcquireTokenInteractive - Got the token");

                return result;
            }
            catch (MsalClientException ex)
            {
                // catch MSAL exception
                Console.WriteLine(ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

Getting started with MSAL.NET

Acquiring tokens

Web Apps / Web APIs / daemon apps

Desktop/Mobile apps

Advanced topics

FAQ

Other resources

Clone this wiki locally