Существует служба, которая отслеживает пользовательские каналы при их подключении и отключении (ниже)
Код: Выделить всё
public class UserCircuit
{
public List CircuitIds { get; set; }
public event Action
MessageReceived;
public void NotifyMessageReceived(ProjectMessageDto message) => MessageReceived?.Invoke(message);
public UserCircuit()
{
CircuitIds = new List();
}
}
public class TrackingCircuitHandler() : CircuitHandler
{
private static readonly ConcurrentDictionary connectedUsers = new();
public override async Task OnConnectionUpAsync(Circuit circuit, CancellationToken cancellationToken)
{
var userId = await GetStatUser();
if (userId != null)
{
lock (connectedUsers)
{
connectedUsers.TryGetValue(userId, out var userCircuit);
userCircuit ??= new UserCircuit();
userCircuit.CircuitIds.Add(circuit.Id);
connectedUsers.TryAdd(userId, userCircuit);
}
}
}
public override async Task OnConnectionDownAsync(Circuit circuit, CancellationToken cancellationToken)
{
var userId = await GetStatUser();
if (userId != null)
{
lock (connectedUsers)
{
connectedUsers.TryGetValue(userId, out var userCircuit);
userCircuit ??= new UserCircuit();
userCircuit.CircuitIds.Remove(circuit.Id);
connectedUsers.TryAdd(userId, userCircuit);
if (userCircuit.CircuitIds.Count == 0)
{
connectedUsers.TryRemove(userId, out var garbage);
}
}
}
}
public async Task GetUserCircuit()
{
var userId = await GetStatUser();
if (userId != null)
{
connectedUsers.TryGetValue(userId, out var userCircuit);
return userCircuit;
}
return null;
}
public async Task GetStatUser()
{
return "userid123";
}
public void NotifyMessageReceived(List userIds, ProjectMessageDto message)
{
foreach (var userId in userIds)
{
connectedUsers.TryGetValue(userId, out var userCircuit);
if (userCircuit != null)
{
userCircuit.NotifyMessageReceived(message);
}
}
}
}
Код: Выделить всё
_usersStateContainer.NotifyMessageReceived(notifyIds, messageDto);
Код: Выделить всё
protected override Task OnInitializedAsync()
{
state.OnMessageReceived += StateOnOnMessageReceived;
return base.OnInitializedAsync();
}
private async void StateOnOnMessageReceived(ProjectMessageDto message)
{
// Handling the message
await InvokeAsync(StateHasChanged);
}
Код: Выделить всё
private async void StateOnOnMessageReceived(ProjectMessageDto message)
{
throw new Exception("DEAD");
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-errors