Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-22 23:58:38

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **多线程编程、异步编程模型、任务调度、死锁预防** 以及 **async/await 的深入理解**,是考察高级 C# 开发者综合能力的好题目。

---

### 🧠 面试题:深入理解 async/await 和线程池死锁

#### 问题描述:

下面的 C# 控制台应用程序代码运行后,控制台输出是什么?为什么?如何修复?

```csharp
using System;
using System.Threading.Tasks;

class Program
{
static void Main()
{
string result = GetResultAsync().Result;
Console.WriteLine(result);
}

static async Task GetResultAsync()
{
await Task.Delay(100);
return await GetValueAsync();
}

static async Task GetValueAsync()
{
await Task.Delay(100);
return "Hello, async world!";
}
}
```

---

### 🎯 考察点:

1. **对 async/await 同步上下文的理解**
2. **对 Task.Result 和死锁的识别能力**
3. **控制台应用程序 vs UI 应用程序中同步上下文的区别**
4. **多线程与线程池调度机制**
5. **如何正确地异步编程并避免死锁**

---

### 🧪 正确答案解析:

#### 输出结果:

- **控制台不会输出任何内容,程序挂起(死锁)**。

#### 原因分析:

在 `Main` 方法中,调用的是:

```csharp
GetResultAsync().Result;
```

`GetResultAsync()` 返回的是一个 `Task`,然后调用 `.Result` 是一个**同步阻塞调用**。

在 `GetResultAsync()` 中,有如下代码:

```csharp
await Task.Delay(100);
return await GetValueAsync();
```

这段代码本质上是:

```csharp
Task.Delay(100).ContinueWith(...);
```

当 `await Task.Delay(100)` 完成后,`await GetValueAsync()` 会尝试将后续的代码**调度回原始上下文**(即调用 `await` 时的同步上下文)。在控制台程序中,这个同步上下文是**线程池上下文(没有特定的 SynchronizationContext)**,所以后续的 `await` 会在线程池线程上继续执行。

但问题是,主线程被 `.Result` 阻塞,等待任务完成。而任务的 continuation(后续操作)需要在线程池中执行,但有可能所有线程池线程都被占用或等待主线程释放资源,从而导致**死锁**。

> ⚠️ 特别注意:虽然控制台程序默认没有 SynchronizationContext,但 `.Result` 会阻塞主线程,而 await 的 continuation 可能会排队在线程池中等待执行,从而导致主线程永远无法继续。

---

### ✅ 正确做法:

应使用 `async/await` 链式调用到底,避免 `.Result` 或 `.Wait()`。

```csharp
static async Task Main()
{
string result = await GetResultAsync();
Console.WriteLine(result);
}
```

这样就能正确异步等待,不会造成死锁。

---

### 🧩 扩展问题(可选追问):

- 如果这段代码运行在 ASP.NET 上下文中,会发生什么?
- 如果将 `await GetValueAsync()` 改为 `await GetValueAsync().ConfigureAwait(false)`,是否可以避免死锁?
- 如何在不修改 `Main()` 方法签名的前提下安全地调用异步方法?

---

如果你需要我继续出类似的专家级 C# 面试题(比如涉及表达式树、反射、性能优化、内存泄漏、GC、LINQ 表达式、TPL 等),欢迎继续提问!

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: c#题例-2025-07-23 05:31:53

下一篇: c#题例-2025-07-22 18:25:19

精华推荐