Bird
Raised Fist0
C Sharp (C#)programming~20 mins

Async and await keywords in C Sharp (C#) - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Async Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of async method with Task.Delay
What is the output of this C# program when run?
C Sharp (C#)
using System;
using System.Threading.Tasks;

class Program {
    static async Task<string> GetMessageAsync() {
        await Task.Delay(100);
        return "Hello";
    }

    static async Task Main() {
        var message = await GetMessageAsync();
        Console.WriteLine(message);
    }
}
ACompilation error
BTask
Cnull
DHello
Attempts:
2 left
💡 Hint
Remember that await waits for the Task to complete and returns the result.
❓ Predict Output
intermediate
2:00remaining
Value of variable after async method call
What is the value of variable 'result' after running this code?
C Sharp (C#)
using System;
using System.Threading.Tasks;

class Program {
    static async Task<int> CalculateAsync() {
        await Task.Delay(50);
        return 10;
    }

    static async Task Main() {
        var task = CalculateAsync();
        int result = task.Result;
        Console.WriteLine(result);
    }
}
A10
B0
CDeadlock or runtime error
DCompilation error
Attempts:
2 left
💡 Hint
Accessing Task.Result blocks until the task completes.
❓ Predict Output
advanced
2:00remaining
Output of async void method with exception
What happens when this program runs?
C Sharp (C#)
using System;
using System.Threading.Tasks;

class Program {
    static async void ThrowExceptionAsync() {
        await Task.Delay(10);
        throw new InvalidOperationException("Error");
    }

    static void Main() {
        ThrowExceptionAsync();
        Console.WriteLine("Done");
        Task.Delay(50).Wait();
    }
}
APrints "Done" then crashes with unhandled exception
BPrints "Done" and exits normally
CDeadlock occurs
DCompilation error due to async void
Attempts:
2 left
💡 Hint
Exceptions in async void methods are not caught by callers.
🧠 Conceptual
advanced
2:00remaining
Understanding async method return types
Which of the following is a valid return type for an async method in C#?
Aasync Task<int>
Basync void
Casync int
Dasync Task
Attempts:
2 left
💡 Hint
Async methods can return Task, Task, or void (rarely).
❓ Predict Output
expert
3:00remaining
Output of concurrent async calls with await
What is the output of this program?
C Sharp (C#)
using System;
using System.Threading.Tasks;

class Program {
    static async Task<string> GetDataAsync(int id) {
        await Task.Delay(50 * id);
        return $"Data{id}";
    }

    static async Task Main() {
        var task1 = GetDataAsync(3);
        var task2 = GetDataAsync(1);
        var task3 = GetDataAsync(2);

        var results = await Task.WhenAll(task1, task2, task3);
        foreach (var r in results) {
            Console.WriteLine(r);
        }
    }
}
A
Data2
Data3
Data1
B
Data1
Data2
Data3
C
Data3
Data1
Data2
DCompilation error
Attempts:
2 left
💡 Hint
Task.WhenAll preserves the order of the tasks in the results array.

Practice

(1/5)
1. What is the main purpose of the async keyword in C#?
easy
A. To make a method run faster by using multiple threads automatically
B. To mark a method that can run asynchronously without blocking the caller
C. To declare a method that returns void only
D. To pause the execution of a method until a task completes

Solution

  1. Step 1: Understand the role of async

    The async keyword marks a method so it can run asynchronously, allowing other work to continue without waiting.
  2. Step 2: Differentiate from other options

    It does not automatically make code faster or use multiple threads, nor does it pause execution by itself.
  3. Final Answer:

    To mark a method that can run asynchronously without blocking the caller -> Option B
  4. Quick Check:

    async marks asynchronous methods = A [OK]
Hint: Async marks methods that run without blocking [OK]
Common Mistakes:
  • Thinking async makes code multithreaded automatically
  • Confusing async with pausing execution
  • Believing async only works with void methods
2. Which of the following is the correct way to declare an asynchronous method that returns a string in C#?
easy
A. public string async GetData()
B. public async string GetData()
C. public Task async<string> GetData()
D. public async Task<string> GetData()

Solution

  1. Step 1: Recall async method return types

    Async methods that return a value must return Task<T>, where T is the return type, here string.
  2. Step 2: Check syntax correctness

    public async Task<string> GetData() correctly uses async Task<string>. Other options have wrong order or missing Task.
  3. Final Answer:

    public async Task<string> GetData() -> Option D
  4. Quick Check:

    Async methods returning values use Task<T> = A [OK]
Hint: Async methods returning values use Task<T> type [OK]
Common Mistakes:
  • Placing async after return type
  • Returning just string instead of Task<string>
  • Using async keyword incorrectly in method signature
3. What will be the output of the following C# code?
async Task<int> GetNumberAsync() { await Task.Delay(100); return 5; }
async Task Main() { var result = await GetNumberAsync(); Console.WriteLine(result); }
medium
A. 5
B. 0
C. Task
D. Compilation error

Solution

  1. Step 1: Understand async method behavior

    The method GetNumberAsync waits 100ms then returns 5 asynchronously.
  2. Step 2: Await the result and print

    The Main method awaits GetNumberAsync and prints the returned value, which is 5.
  3. Final Answer:

    5 -> Option A
  4. Quick Check:

    Await returns method result = 5 [OK]
Hint: Await unwraps async result to actual value [OK]
Common Mistakes:
  • Expecting Task object printed instead of value
  • Ignoring await causing wrong output
  • Thinking async delays block main thread
4. Identify the error in this code snippet:
async Task<int> CalculateAsync() { return 10; }
void Main() { var result = CalculateAsync(); Console.WriteLine(result); }
medium
A. Missing await keyword when calling CalculateAsync
B. CalculateAsync should return int, not Task<int>
C. Main method must be async to call CalculateAsync
D. CalculateAsync cannot return a value

Solution

  1. Step 1: Analyze method call and return type

    CalculateAsync returns a Task<int>, but Main calls it without await, so result is a Task, not int.
  2. Step 2: Understand how to get actual value

    To get the int value, await must be used, but Main is not async, so this is a problem.
  3. Final Answer:

    Missing await keyword when calling CalculateAsync -> Option A
  4. Quick Check:

    Call async method with await = C [OK]
Hint: Always await async calls to get results [OK]
Common Mistakes:
  • Calling async method without await
  • Expecting async method to return direct value
  • Making Main async without proper signature
5. You want to run two independent async tasks and get their results as soon as both finish. Which code correctly does this in C#?
hard
A. var result1 = await Task1(); var result2 = await Task2();
B. var result1 = Task1().Result; var result2 = Task2().Result;
C. var task1 = Task1(); var task2 = Task2(); var result1 = await task1; var result2 = await task2;
D. await Task.WhenAll(Task1(), Task2()); var result1 = Task1().Result; var result2 = Task2().Result;

Solution

  1. Step 1: Understand running tasks concurrently

    Starting both tasks without awaiting immediately lets them run in parallel.
  2. Step 2: Await both tasks after starting

    Awaiting each task after starting both ensures you wait for both to finish and get results efficiently.
  3. Step 3: Analyze other options

    var result1 = await Task1(); var result2 = await Task2(); awaits sequentially, running tasks one after another. var result1 = Task1().Result; var result2 = Task2().Result; blocks synchronously causing deadlocks. await Task.WhenAll(Task1(), Task2()); var result1 = Task1().Result; var result2 = Task2().Result; awaits but then calls Result again, causing redundant calls.
  4. Final Answer:

    var task1 = Task1(); var task2 = Task2(); var result1 = await task1; var result2 = await task2; -> Option C
  5. Quick Check:

    Start tasks first, then await both = B [OK]
Hint: Start tasks first, then await both to run concurrently [OK]
Common Mistakes:
  • Awaiting tasks one by one causing sequential execution
  • Using .Result causing blocking and deadlocks
  • Calling tasks multiple times causing duplicate work
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard