Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-06 00:51:51

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它不仅考察语言特性,还涉及设计模式、多线程、委托/事件、泛型、以及面向对象设计能力,适合用于考察高级工程师的综合理解与实战能力。

---

### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)

#### 📌 背景:
在现代应用程序中(尤其是解耦架构,如 MVVM、CQRS、微服务等),**事件总线(Event Bus)** 是一种常见的设计模式,用于在组件之间发布和订阅事件。

#### ✅ 任务:
请你使用 C# 实现一个**线程安全的事件总线**,满足以下要求:

1. 支持订阅和取消订阅事件。
2. 支持泛型事件(例如:`EventA`, `EventB`)。
3. 支持多个订阅者。
4. 事件处理必须是线程安全的(支持并发发布事件)。
5. 支持同步和异步事件处理(即支持同步和异步的订阅方法)。
6. 支持事件处理的优先级(可选加分项)。
7. 提供一个示例说明如何使用你的事件总线。

---

### 📦 示例接口设计建议(可自定义):

```csharp
public interface IEventBus
{
void Subscribe(object subscriber, Action handler) where T : class;
void SubscribeAsync(object subscriber, Func handler) where T : class;
void Unsubscribe(object subscriber) where T : class;
void Publish(T @event) where T : class;
Task PublishAsync(T @event) where T : class;
}
```

---

### 💡 提示与考察点:

- 使用 `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(subscriber, subscriber.HandleEvent);
eventBus.SubscribeAsync(subscriber, subscriber.HandleEventAsync);

eventBus.Publish(new MyEvent { Message = "Hello EventBus!" });

Console.ReadLine();
}
}
```

---

### 🧾 预期输出:

```
Sync handler received: Hello EventBus!
Async handler received: Hello EventBus!
```

---

### 🧩 加分项(面试官最爱):

- 支持自动取消订阅(如使用 `IDisposable`)。
- 支持基于属性的自动订阅(通过反射)。
- 支持事件过滤、优先级排序。
- 使用 `Expression Trees` 来优化委托调用。
- 使用 `Span` 或 `Memory` 进行高性能优化(可选)。

---

如果你需要参考实现或者想看一个完整实现示例,我也可以提供 😎

是否需要我给出一个完整的参考实现?

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

上一篇:无

下一篇: c#题例-2025-08-05 19:18:24

精华推荐