我正在使用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);
}
答案 0 :(得分:1)
Add()
是异步的:它返回Task
。 Task.Run()
理解这一点,但你需要将Task
返回给它(注意lambda不再是一个块):
Task.Run(() => Context.Groups.Add(connection, groupId))
这类似于在返回的Wait()
上调用Task
,除了它更好,因为它不会阻塞线程。
答案 1 :(得分:0)
Groups.Add是异步的。您正在创建一个运行Groups.Add的任务,但它几乎立即完成,因为任务的内部部分不会等到groups.add完成。
因此,您需要等到groups.Add在Task.Run中完成。
类似的东西:
var tasks = allconnections
.Select(connection =>
Task.Run(() => { Context.Groups.Add(connection, groupId).Wait(); })).ToArray();