首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SignalR与Groups.Add

SignalR与Groups.Add
EN

Stack Overflow用户
提问于 2013-10-10 06:11:24
回答 2查看 447关注 0票数 0

我正在使用SignalR。当对话完成后,我试图在对话中添加所有收件人,并通知在线收件人。

所有代码都很好,但是只通知第一个接收者。

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-10 07:40:11

Groups.Add是异步的。您正在创建一个运行Groups.Add的任务,但它几乎立即完成,因为任务的内部部分不会等到groups.add完成。

因此,您需要等到groups.Add在Task.Run中完成为止。

类似于:

代码语言:javascript
复制
var tasks = allconnections
    .Select(connection =>
            Task.Run(() => { Context.Groups.Add(connection, groupId).Wait(); })).ToArray();
票数 0
EN

Stack Overflow用户

发布于 2013-10-10 10:10:43

Add()是异步的:它返回一个TaskTask.Run()理解这一点,但您需要将该Task返回给它(请注意,lambda已不在块中):

代码语言:javascript
复制
Task.Run(() => Context.Groups.Add(connection, groupId))

这类似于在返回的Wait()上调用Task,只不过它更好,因为它不阻塞线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19288313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档