Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-22 07:18:46

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它融合了 **委托、泛型、闭包、线程安全、异步编程** 等高级概念,适合考察候选人的综合能力。

---

### 💼 面试题:构建一个线程安全的事件总线(Event Bus)

#### 🧠 题目描述:

请设计并实现一个轻量级的**线程安全事件总线(Event Bus)**,支持以下功能:

1. 注册事件处理器(订阅者):
- 可以订阅特定类型的事件(泛型)。
- 支持多个订阅者监听同一事件。
- 支持使用 `Func` 或 `Action` 作为处理器。

2. 取消注册事件处理器(取消订阅)。

3. 发布事件:
- 广播事件给所有已注册的处理函数。
- 所有事件处理应**异步执行**,但发布者不等待处理完成(fire-and-forget)。
- 如果处理器是 `Func`,应异步调用并捕获异常,防止一个处理器失败导致整个事件广播失败。

4. 保证线程安全:
- 多线程环境下注册、取消注册和发布事件的操作必须是线程安全的。

---

### ✅ 要求:

- 使用 C# 的高级特性实现,如泛型、委托、并发集合等。
- 不使用第三方库(如 `System.Reactive`)。
- 提供一个简单的使用示例。
- 可选:支持事件处理器的优先级或同步/异步混合处理。

---

### 🧪 示例用法:

```csharp
var eventBus = new EventBus();

// 订阅一个事件
eventBus.Subscribe(@event =>
{
Console.WriteLine($"Received event with message: '{@event.Message}'");
});

// 发布事件
eventBus.Publish(new SampleEvent { Message = "Hello World!" });
```

---

### 🧱 参考答案(部分实现):

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

public interface IEventBus
{
void Subscribe(Action handler) where T : class;
void Subscribe(Func handler) where T : class;
void Unsubscribe(Action handler) where T : class;
void Unsubscribe(Func handler) where T : class;
void Publish(T @event) where T : class;
}

public class EventBus : IEventBus
{
private readonly ConcurrentDictionary _handlers =
new ConcurrentDictionary();

public void Subscribe(Action handler) where T : class
{
GetOrAddHandlerList().Add(handler);
}

public void Subscribe(Func handler) where T : class
{
GetOrAddHandlerList().Add(handler);
}

public void Unsubscribe(Action handler) where T : class
{
if (_handlers.TryGetValue(typeof(T), out var list))
{
((ConcurrentBag)list).TryTake(out _);
}
}

public void Unsubscribe(Func handler) where T : class
{
if (_handlers.TryGetValue(typeof(T), out var list))
{
((ConcurrentBag)list).TryTake(out _);
}
}

public void Publish(T @event) where T : class
{
if (_handlers.TryGetValue(typeof(T), out var handlers))
{
foreach (var handler in (ConcurrentBag)handlers)
{
if (handler is Action actionHandler)
{
Task.Run(() => actionHandler(@event));
}
else if (handler is Func asyncHandler)
{
Task.Run(async () => await asyncHandler(@event).ConfigureAwait(false))
.ConfigureAwait(false);
}
}
}
}

private ConcurrentBag GetOrAddHandlerList()
{
return (ConcurrentBag)_handlers.GetOrAdd(typeof(T), new ConcurrentBag());
}
}

// 示例事件
public class SampleEvent
{
public string Message { get; set; }
}
```

---

### 📌 进阶问题(可选):

1. 如何支持事件处理器的优先级?
2. 如何限制事件处理的最大并发数?
3. 如何实现事件处理的同步/异步混合模式?
4. 如何实现事件的过滤机制(如只处理某个子类型的事件)?

---

这道题目可以考察候选人:

- 对 C# 委托与泛型的理解。
- 对异步编程模型的掌握(async/await + Task)。
- 对线程安全和并发集合的应用。
- 对设计模式的理解(如观察者模式)。
- 编码风格与系统设计能力。

如果你需要我进一步解释或扩展这个实现,也可以告诉我!

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

上一篇: c#题例-2025-07-22 12:51:56

下一篇: c#题例-2025-07-22 00:31:46

精华推荐