簡體   English   中英

使用Signalr中的異步服務器到客戶端消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM