我正在使用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);
}发布于 2013-10-10 07:40:11
Groups.Add是异步的。您正在创建一个运行Groups.Add的任务,但它几乎立即完成,因为任务的内部部分不会等到groups.add完成。
因此,您需要等到groups.Add在Task.Run中完成为止。
类似于:
var tasks = allconnections
.Select(connection =>
Task.Run(() => { Context.Groups.Add(connection, groupId).Wait(); })).ToArray();发布于 2013-10-10 10:10:43
Add()是异步的:它返回一个Task。Task.Run()理解这一点,但您需要将该Task返回给它(请注意,lambda已不在块中):
Task.Run(() => Context.Groups.Add(connection, groupId))这类似于在返回的Wait()上调用Task,只不过它更好,因为它不阻塞线程。
https://stackoverflow.com/questions/19288313
复制相似问题