📖 Scenario: You are building a simple console app that simulates a task running asynchronously, like downloading a file. You want to see how the program continues running while waiting for the task to finish.
🎯 Goal: Learn how async and await work in C# by creating a simple async method and observing the order of execution.
📋 What You'll Learn
Create an async method that waits for 2 seconds
Call the async method from Main using await
Print messages before and after the async call to show flow
Use Task.Delay to simulate waiting
💡 Why This Matters
🌍 Real World
Async programming is used in apps to keep the interface responsive while waiting for tasks like downloading files or accessing databases.
💼 Career
Understanding async flow is important for software developers working on modern applications that handle multiple tasks efficiently.
Progress0 / 4 steps
1
Create the async method
Create an async method called SimulateAsyncTask that returns Task and uses await Task.Delay(2000) to wait for 2 seconds.
C Sharp (C#)
Hint
Use async Task as the method signature and await Task.Delay(2000); inside the method.
2
Add Main method and print before calling async method
Add a Main method with async Task Main(). Inside it, print "Starting async task..." before calling SimulateAsyncTask() with await.
C Sharp (C#)
Hint
Remember to mark Main as async Task and use await when calling SimulateAsyncTask().
3
Print after awaiting async method
In the Main method, after await SimulateAsyncTask(), print "Async task completed." to show the flow continues after waiting.
C Sharp (C#)
Hint
Print the message after the await line to show the program waits for the async task.
4
Run and observe the output
Run the program and observe the output. It should print "Starting async task...", wait 2 seconds, then print "Async task completed.". Write Console.WriteLine statements exactly as shown.
C Sharp (C#)
Hint
Run the program and watch the console output. The messages should appear in order with a 2-second pause between.
Practice
(1/5)
1. What does the await keyword do in an async method in C#?
easy
A. It immediately blocks the thread until the awaited task completes.
B. It converts a synchronous method into an asynchronous one automatically.
C. It pauses the method until the awaited task completes without blocking the thread.
D. It cancels the running async method.
Solution
Step 1: Understand the role of await
The await keyword pauses the async method execution until the awaited task finishes, but it does not block the thread, allowing other work to continue.
Step 2: Differentiate from blocking
Blocking the thread would freeze the program, but await allows the thread to be free for other tasks.
Final Answer:
It pauses the method until the awaited task completes without blocking the thread. -> Option C
Quick Check:
await pauses without blocking [OK]
Hint: Remember: await pauses method but frees thread [OK]
Common Mistakes:
Thinking await blocks the thread
Confusing await with async keyword
Assuming await cancels tasks
2. Which of the following is the correct syntax to declare an asynchronous method in C#?
easy
A. public async void MyMethod() { }
B. public void async MyMethod() { }
C. async public void MyMethod() { }
D. public void MyMethod async() { }
Solution
Step 1: Identify correct async method declaration
The correct syntax places the async keyword before the return type: public async void MyMethod().
Step 2: Check other options for syntax errors
Options A, B, and D have incorrect keyword order or placement, which causes syntax errors.
Final Answer:
public async void MyMethod() { } -> Option A
Quick Check:
async keyword before return type [OK]
Hint: Put async before return type in method declaration [OK]
Common Mistakes:
Placing async after return type
Using async as a method modifier incorrectly
Adding parentheses after async
3. What will be the output of the following C# code?
async Task<int> GetNumberAsync() {
await Task.Delay(100);
return 5;
}
async Task MainAsync() {
var task = GetNumberAsync();
Console.WriteLine("Before await");
int result = await task;
Console.WriteLine($"Result: {result}");
}
MainAsync().Wait();
medium
A. No output due to deadlock
B. Before await\nResult: 5
C. Before await
D. Result: 5\nBefore await
Solution
Step 1: Analyze the order of execution
The method prints "Before await" immediately after starting the async task, then awaits the task completion before printing the result.
Step 2: Understand await behavior
Await pauses MainAsync until GetNumberAsync completes, then prints "Result: 5".
Final Answer:
Before await\nResult: 5 -> Option B
Quick Check:
Print before await, then after task completes [OK]
Hint: Output before await prints first, then awaited result [OK]
Common Mistakes:
Assuming result prints before 'Before await'
Thinking await blocks main thread
Expecting no output due to deadlock
4. Identify the problem in this async code snippet:
A. Method should not be async if it returns a value.
B. Return type should be void, not Task<int>.
C. Task.Delay cannot be used inside async methods.
D. Missing await before Task.Delay, so delay is ignored.
Solution
Step 1: Check usage of Task.Delay
The method calls Task.Delay(1000) but does not await it, so the delay runs but the method immediately returns 10.
Step 2: Understand effect of missing await
Without await, the delay is ignored in terms of method flow, causing unexpected behavior.
Final Answer:
Missing await before Task.Delay, so delay is ignored. -> Option D
Quick Check:
Always await async calls to run properly [OK]
Hint: Always await async calls like Task.Delay [OK]
Common Mistakes:
Forgetting await before async calls
Changing return type unnecessarily
Thinking Task.Delay is invalid in async
5. You want to run two independent async tasks TaskA() and TaskB() concurrently and wait for both to finish before continuing. Which code snippet correctly achieves this?
hard
A. await Task.WhenAll(TaskA(), TaskB());
B. await TaskA(); await TaskB();
C. TaskA().Wait(); TaskB().Wait();
D. Task.Run(() => TaskA()); Task.Run(() => TaskB());
Solution
Step 1: Understand concurrency with async tasks
Running await TaskA(); await TaskB(); runs tasks sequentially, not concurrently.
Step 2: Use Task.WhenAll for parallel execution
await Task.WhenAll(TaskA(), TaskB()); starts both tasks concurrently and awaits their completion together.
Step 3: Evaluate other options
TaskA().Wait(); TaskB().Wait(); blocks threads synchronously, and D starts tasks but does not await completion.
Final Answer:
await Task.WhenAll(TaskA(), TaskB()); -> Option A
Quick Check:
Use Task.WhenAll to await multiple tasks concurrently [OK]
Hint: Use Task.WhenAll to await multiple tasks together [OK]
Common Mistakes:
Awaiting tasks one after another (sequential)
Blocking with Wait() causing deadlocks
Starting tasks without awaiting completion
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.