如何在SignalR Websockets中并行发出请求?他们很慢

时间:2018-04-03 13:42:22

标签: performance concurrency websocket signalr

我想使用websockets从我的图像服务器加载大量图像切片以填充大的马赛克图像。每个磁贴为512x512px,jpg压缩,在服务器上生成0.5秒。

SignalR提供了一种使用websockets的好方法。但是,当我向服务器发出多个请求(> 100)以生成并返回所有切片时,似乎这些请求是按顺序处理的,而不是并行处理的。

有没有办法让这些瓷砖比顺序更快?

我想使用websockets,因为原始图像无法足够快地下载:浏览器只允许6个并发连接到服务器。

My C#hub class:

public class MyHub : Hub
{
    public string GetTile(string url)
    {
        // simulate tile generation by sleep for 1 sec
        System.Threading.Thread.Sleep(1000);
        return "tile created";
    }
}

我的javascript代码:

        // create a custom SignalR Object
        var mySignalRHub = $.connection.myHub;
        mySignalRHub.client.echo = function (text) {
            console.info(text);
        };

        $.connection.hub.start().done(function () { 
            var _i = 0;
            var _j = 0;
            for (var i = 0; i < 60; i++) {
                for (var j = 0; j < 43; j++) {
                    console.info("Asking for tile " + _j);
                    mySignalRHub.server.getTile("tileurl").done(function (data) {
                        console.log('tile ' + _i + ' created');
                        _i++;
                    });
                    _j++;
                }
            }
        });

该计划将&#34;要求&#34;甚至在获得第一个响应之前的所有瓦片。

然后,每隔一秒,一个新的响应将发送给客户端(而不是一秒钟之后,几乎同时返回所有响应)。

为什么呢?这个过程如何并行化?

1 个答案:

答案 0 :(得分:0)

它必须使用单个线程,并且您正在调用Thread.Sleep。如果希望它们尽快返回,请使用单独的线程(例如BackgroundWorker)来处理请求。队列/出队机制可能对此很好工作。然后,当项目清除队列时,您可以使用客户端方法(而不是基本的“获取”请求)将响应泵回。

如果可能的话,传递一个数组而不是发送大量的小请求。如果您出于用户体验/性能的原因希望将其加载为“块”,请在性能仍然成问题的情况下尝试更大的块。