在signalr中使用async的服务器到客户端消息

时间:2013-09-09 14:16:23

标签: c# signalr signalr-hub

目前我正在使用此代码向每个客户端发送略有不同的消息。当有100多个客户端时,没有任务的相同代码会阻止我的计时器循环,我怀疑它也会阻止所有Web请求。

ConcurrentDictionary Sessions;
// ...


var context = GlobalHost.ConnectionManager.GetHubContext<TiHub>();
foreach(var kp in Sessions) 
{
    var client = context.Clients.Client(kp.Key);
    if (client != null)
     {
          client.changed(new Data{ data=somevalue(kp.Value) });
     }
}

异步版

        var context = GlobalHost.ConnectionManager.GetHubContext<TiHub>();

        return Task.Run(() =>
        {
            Parallel.ForEach(Sessions, kp =>
            {
                var client = context.Clients.Client(kp.Key);
                if (client != null)
                {
                    client.changed(new Data{ data=somevalue(kp.Value) });
                }
            });

        });

我想要“更改”的任务或异步版本。类似的东西:

client.changedAsync(new Data{ data=somevalue(kp.Value) });

SignalR是否支持此功能?

1 个答案:

答案 0 :(得分:0)

client.changed I / O绑定还是CPU绑定?

我认为它受I / O限制,您将从async-await中受益。

而不是Parallel.ForEach你可以尝试这样的事情:

var context = GlobalHost.ConnectionManager.GetHubContext<TiHub>();
var tasks = (from kp in Sessions
             let client = context.Clients.Client(kp.Key)
             where client != null
             select Task.Run(() =>
                 {
                     client.changed(new Data{ data = somevaluekp.Value);
                 })).ToArray();

await Task.WhenAll(tasks);

但是你应该尝试使用自然的async-await API而不是人工的Task.Run`。