c#题例-2025-08-06 00:51:51
日期: 2025-08-06 分类: AI写作 4次阅读
当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它不仅考察语言特性,还涉及设计模式、多线程、委托/事件、泛型、以及面向对象设计能力,适合用于考察高级工程师的综合理解与实战能力。
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)
#### 📌 背景:
在现代应用程序中(尤其是解耦架构,如 MVVM、CQRS、微服务等),**事件总线(Event Bus)** 是一种常见的设计模式,用于在组件之间发布和订阅事件。
#### ✅ 任务:
请你使用 C# 实现一个**线程安全的事件总线**,满足以下要求:
1. 支持订阅和取消订阅事件。
2. 支持泛型事件(例如:`EventA`, `EventB`)。
3. 支持多个订阅者。
4. 事件处理必须是线程安全的(支持并发发布事件)。
5. 支持同步和异步事件处理(即支持同步和异步的订阅方法)。
6. 支持事件处理的优先级(可选加分项)。
7. 提供一个示例说明如何使用你的事件总线。
---
### 📦 示例接口设计建议(可自定义):
```csharp
public interface IEventBus
{
void Subscribe
void SubscribeAsync
void Unsubscribe
void Publish
Task PublishAsync
}
```
---
### 💡 提示与考察点:
- 使用 `ConcurrentDictionary` 或 `Dictionary + lock` 来管理事件订阅。
- 每个事件类型 `T` 应该有其对应的订阅者列表。
- 考虑使用 `WeakReference` 避免内存泄漏(加分项)。
- 异步处理时要处理异常并避免阻塞主线程。
- 使用 `CancellationToken` 控制异步取消(可选加分)。
- 可使用 `System.Reactive` 中的 `IObservable` 来扩展功能(加分)。
- 可使用 `System.Collections.Concurrent` 中的线程安全集合。
- 可以引入优先级队列来实现事件优先级处理。
---
### ✅ 示例用法:
```csharp
class Program
{
public class MyEvent
{
public string Message { get; set; }
}
public class MySubscriber
{
public void HandleEvent(MyEvent e)
{
Console.WriteLine($"Sync handler received: {e.Message}");
}
public async Task HandleEventAsync(MyEvent e)
{
await Task.Delay(100);
Console.WriteLine($"Async handler received: {e.Message}");
}
}
static void Main()
{
var eventBus = new ThreadSafeEventBus();
var subscriber = new MySubscriber();
eventBus.Subscribe
eventBus.SubscribeAsync
eventBus.Publish(new MyEvent { Message = "Hello EventBus!" });
Console.ReadLine();
}
}
```
---
### 🧾 预期输出:
```
Sync handler received: Hello EventBus!
Async handler received: Hello EventBus!
```
---
### 🧩 加分项(面试官最爱):
- 支持自动取消订阅(如使用 `IDisposable`)。
- 支持基于属性的自动订阅(通过反射)。
- 支持事件过滤、优先级排序。
- 使用 `Expression Trees` 来优化委托调用。
- 使用 `Span
---
如果你需要参考实现或者想看一个完整实现示例,我也可以提供 😎
是否需要我给出一个完整的参考实现?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐