Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-08 11:58:23

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,涵盖了 **委托、泛型、异步编程、闭包捕获、线程安全和性能优化**等多个高级主题:

---

### 🧠 面试题:并发执行多个异步任务并聚合结果(带超时与异常处理)

#### 问题描述:

你被要求实现一个名为 `ExecuteAllWithTimeoutAsync` 的泛型方法,该方法接受一个 `Func>[]` 类型的任务数组,并发地运行这些任务,返回每个任务的结果或在任意任务失败时抛出异常。同时,整个操作应在指定的超时时间内完成。

#### 方法签名如下:

```csharp
Task ExecuteAllWithTimeoutAsync(
Func>[] tasks,
TimeSpan timeout,
CancellationToken cancellationToken = default);
```

#### 要求如下:

1. 所有任务应**并发执行**。
2. 如果所有任务都成功完成且未超时,返回一个包含所有结果的数组。
3. 如果任何一个任务抛出异常,立即取消所有其他任务,并传播该异常。
4. 如果总耗时超过 `timeout`,则取消所有任务并抛出 `TimeoutException`。
5. 必须支持外部传入的 `cancellationToken`,并在其触发时取消所有任务并抛出 `OperationCanceledException`。
6. 不得产生内存泄漏或线程安全问题。
7. 性能要尽可能高效,避免不必要的开销。

---

### 💡 提示与考察点:

- 如何使用 `CancellationTokenSource` 组合多个取消令牌?
- 如何并发运行多个异步任务并等待全部完成?
- 如何处理多个 `Task` 的异常聚合?
- 如何确保超时和取消都能正确终止所有子任务?
- 是否了解 `Task.WhenAll` 的行为及其局限性?
- 是否理解闭包捕获在异步代码中的潜在陷阱?

---

### ✅ 示例用法:

```csharp
var cts = new CancellationTokenSource();
var tasks = new Func>[]
{
async ct => { await Task.Delay(100, ct); return 1; },
async ct => { await Task.Delay(200, ct); return 2; }
};

try
{
int[] results = await ExecuteAllWithTimeoutAsync(tasks, TimeSpan.FromMilliseconds(150), cts.Token);
Console.WriteLine(string.Join(", ", results)); // 应输出: 1, 2 或超时
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
```

---

如果你需要我提供参考实现或者解析思路,也可以告诉我 😊

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

上一篇: c#题例-2025-07-08 17:31:44

下一篇: c#题例-2025-07-08 06:25:08

精华推荐