SignalR和Groups.Add in foreach

时间:2013-10-10 06:11:24

标签: c# asynchronous signalr async-await

我正在使用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);
}

2 个答案:

答案 0 :(得分:1)

Add()是异步的:它返回TaskTask.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();