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);
}
Add()
是异步的:它返回一个Task
。 Task.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();