public class EventBusManager {
readonly Dictionary buses = [];
public EventBus GetIncrementUsage(string roomId) {
lock (buses) {
if (!buses.TryGetValue(roomId, out var busUsage)) {
busUsage = new BusUsage(new EventBus());
buses.Add(roomId, busUsage);
return busUsage.Bus;
}
busUsage.UsageCount++;
return busUsage.Bus;
}
}
public void DecrementUsage(string roomId) {
lock (buses) {
if (!buses.TryGetValue(roomId, out var busUsage))
return;
busUsage.UsageCount--;
if (busUsage.UsageCount == 0)
buses.Remove(roomId);
}
}
record BusUsage(EventBus Bus) {
public int UsageCount = 1;
};
}
Как реализовать потокобезопасную автоматическую очистку словаря? [code]EventBusManager[/code] должен предоставить экземпляр EventBus для каждого идентификатора комнаты.
[code]EventBusManager[/code] использование: [code]// When user connect to room var eventBus = evtBusManager.GetIncrementUsage(roomId);
// When user disconnect evtBusManager.DecrementUsage(roomId); [/code] [code]EventBusManager[/code] реализация: [code]public class EventBusManager { readonly Dictionary buses = [];
public EventBus GetIncrementUsage(string roomId) { lock (buses) { if (!buses.TryGetValue(roomId, out var busUsage)) { busUsage = new BusUsage(new EventBus()); buses.Add(roomId, busUsage); return busUsage.Bus; }
busUsage.UsageCount++; return busUsage.Bus; } }
public void DecrementUsage(string roomId) { lock (buses) { if (!buses.TryGetValue(roomId, out var busUsage)) return;
busUsage.UsageCount--;
if (busUsage.UsageCount == 0) buses.Remove(roomId); } }
record BusUsage(EventBus Bus) { public int UsageCount = 1; }; } [/code] Является ли реализация потокобезопасной?
Как реализовать потокобезопасную автоматическую очистку словаря?
EventBusManager должен предоставить экземпляр EventBus для каждого идентификатора комнаты.
EventBusManager использование:
// When user connect to room
var eventBus =...
Как реализовать потокобезопасную автоматическую очистку словаря?
EventBusManager должен предоставить экземпляр EventBus для каждого идентификатора комнаты.
EventBusManager использование:
// When user connect to room
var eventBus =...