// async keyword tells the compiler we're writing an async method
// Task<int> is a 'Future'/Promise that will eventually yield a value of type int
async Task<int> GetUserAgeFromDatabase(string username) {
	// await keyword tells the compiler to convert this method in to a state machine at this point
	// Method will return the Task<int> immediately at this point (assuming GetUserDetails() does not complete immediately and synchronously)
	// A continuation for the remainder of the method will be scheduled either on this thread (via captured context) or on task pool thread (by default) to be executed once GetUserDetails()'s Task has completed
	var userDetails = await _databaseAccessLayer.GetUserDetails(username);
	// Once we're here, we're executing the continuation
	return userDetails.Age;

Code snippet taken from "Two Decades of C#: A Reference - C# 5 and C# 6".