在信号器中使用异步的服务器到客户端消息
本文关键字:服务器 客户端 消息 异步 信号器 | 更新日期: 2023-09-27 18:30:37
目前我使用此代码向每个客户端发送略有不同的消息。当有 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) });
这在信号中是否受支持?
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'。