# async and await — .NET Core: Build, Test and Ship Web APIs

Source: https://www.geekswithgeeks.com/en/dotnet-core/cs-async-await

> Write non-blocking code with Task, async and await and avoid the common deadlock traps.

## Do not block a thread

While a request waits for a database or HTTP call, `await` frees the thread to serve other requests. The method resumes when the result is ready. This is how a small thread pool serves many users.

## An async method

An async method returns `Task<T>`. Awaiting it gives the `T`. `Task.Delay` stands in for a slow call here.

```csharp
static async Task<int> GetCountAsync()
{
    await Task.Delay(100);
    return 42;
}

var count = await GetCountAsync();
Console.WriteLine(count);
```

Output:

```
42
```

## Never use .Result or .Wait()

Blocking on a task with `.Result` or `.Wait()` wastes a thread and can deadlock in some app types. Make the whole call chain `async` instead, and avoid `async void` except for event handlers.

**Quiz:** What should an async method that returns no value return?

- [ ] void
- [ ] int
- [x] Task
- [ ] object

*Answer:* Task. Return `Task` so callers can await it and catch exceptions. `async void` hides failures.
