0

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

2 回答 2

1

Add()是异步的:它返回一个Task. Task.Run()理解这一点,但您需要将其返回Task给它(注意 lambda 不再位于块中):

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

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

于 2013-10-10T10:10:43.937 回答
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();
于 2013-10-10T07:40:11.257 回答