[英]server to client message using async in signalr
目前,我正在使用此代碼向每個客戶端發送略有不同的消息。 當有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是否支持此功能?
是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`。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.