c#题例-2025-08-07 05:51:56
日期: 2025-08-07 分类: AI写作 10次阅读
当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **多线程、异步编程、死锁预防、线程安全、TPL(任务并行库)** 和 **设计模式** 的综合运用,适合考察候选人对 C# 高级特性和并发编程的理解。
---
### 🧠 **题目:设计一个线程安全且可取消的异步任务调度器**
#### 背景描述:
你正在为一个高性能后台服务设计一个任务调度器,该调度器需要:
- 支持注册多个异步任务(每个任务是 `Func
- 按照 FIFO 顺序依次执行这些任务;
- 支持全局取消所有任务(通过一个 `CancellationToken`);
- 每个任务可以被取消,但不能影响其他任务;
- 支持并发执行多个任务(由用户指定最大并发数);
- 所有操作必须是线程安全的;
- 不允许出现死锁;
- 支持等待所有任务完成(`WaitForCompletionAsync` 方法)。
---
### ✅ **要求:**
请实现一个类 `AsyncTaskScheduler`,满足以下接口:
```csharp
public interface IAsyncTaskScheduler : IDisposable
{
///
/// 注册一个异步任务
///
void RegisterTask(Func
///
/// 启动调度器并开始执行任务
///
/// 最大并发任务数
/// 可选的全局取消令牌
///
Task StartAsync(int maxConcurrency, CancellationToken cancellationToken = default);
///
/// 等待所有任务完成
///
Task WaitForCompletionAsync(CancellationToken cancellationToken = default);
}
```
---
### 🧪 **附加问题(用于面试深入探讨):**
1. 如果某个任务抛出异常,调度器应如何处理?
2. 如何避免在多个线程中同时调用 `RegisterTask` 时发生竞争?
3. 如何避免在 `StartAsync` 被多次调用时出错?
4. 如何实现取消机制,使得单个任务能感知全局取消?
5. 使用 `Channel
6. 如果并发数设置为 1,是否等价于顺序执行?
7. 如何测试该调度器的线程安全性?
---
### 💡 **提示(可选提供给候选人):**
- 使用 `System.Threading.Tasks.Dataflow` 或 `System.Threading.Channels`;
- 使用 `SemaphoreSlim` 控制并发;
- 使用 `Task.Run` 或 `TaskFactory` 来启动任务;
- 使用 `CancellationTokenSource` 的父子令牌机制;
- 考虑使用 `ConcurrentQueue
- 使用 `TaskCompletionSource` 实现 `WaitForCompletionAsync`。
---
### 示例使用方式(供参考):
```csharp
using var scheduler = new AsyncTaskScheduler();
scheduler.RegisterTask(async ct =>
{
await Task.Delay(1000, ct);
Console.WriteLine("Task 1 completed");
});
scheduler.RegisterTask(async ct =>
{
await Task.Delay(500, ct);
Console.WriteLine("Task 2 completed");
});
var cts = new CancellationTokenSource();
cts.CancelAfter(1500); // 1.5秒后取消
await scheduler.StartAsync(2, cts.Token);
await scheduler.WaitForCompletionAsync();
```
---
这道题综合了 C# 中多个高级知识点,能很好地考察候选人的架构设计能力、并发编程水平和对异步模型的深入理解。如果你需要这道题的参考实现,我也可以提供。需要吗?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐