.Result — blocking. await — non-blocking.
Task.Result:
1Task<int> task = GetDataAsync();2int result = task.Result; // Blocks thread!
await:
1int result = await GetDataAsync(); // Non-blocking
Deadlock example:
1// UI/ASP.NET context2private void Button_Click(object sender, RoutedEventArgs e) {3 // Bad — deadlock!4 var result = GetDataAsync().Result;56 // Good — no deadlock7 var result = await GetDataAsync();8}
Why Result causes deadlock:
Best practice: