SignalR and Groups.Add in foreach

本文关键字:in foreach Add Groups and SignalR | 更新日期: 2023-09-27 18:34:37

我正在使用SignalR。对话完成后,我正在尝试在对话中添加所有收件人并通知在线收件人。

所有代码都很好,但它只通知第一个收件人。 所以我想广播只是第一次等待

public void NotifyConversation(ConversationModel model, string name)
{
    var groupId = model.ID.ToString();
    var recipients = model.Recipients;
    var allconnections = new List<string>();

    foreach (var recipient in recipients)
    {
        var connections = _manager.GetConnections(recipient.Name).Where(x => x != null);
        allconnections.AddRange(connections);
    }
    var tasks = allconnections
        .Select(connection =>
                Task.Run(() => { Context.Groups.Add(connection, groupId); })).ToArray();
    Task.WaitAll(tasks);
    Context.Clients.Group(groupId).broadcastConversation(model);
}

SignalR and Groups.Add in foreach

Add()是异步的:它返回一个TaskTask.Run()明白这一点,但您需要将该Task返回给它(请注意,lambda 不再在块中(:

Task.Run(() => Context.Groups.Add(connection, groupId))

这类似于在返回的Task上调用Wait(),只是它更好,因为它不会阻塞线程。

Groups.Add 是异步的。 您正在创建一个任务来运行 Groups.Add,但它几乎立即完成,因为任务的内部不会等到 groups.add 完成。

因此,您需要等到组。添加已在 Task.Run 中完成。

像这样:

var tasks = allconnections
    .Select(connection =>
            Task.Run(() => { Context.Groups.Add(connection, groupId).Wait(); })).ToArray();