我想使用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;甚至在获得第一个响应之前的所有瓦片。
然后,每隔一秒,一个新的响应将发送给客户端(而不是一秒钟之后,几乎同时返回所有响应)。
为什么呢?这个过程如何并行化?
答案 0 :(得分:0)
它必须使用单个线程,并且您正在调用Thread.Sleep。如果希望它们尽快返回,请使用单独的线程(例如BackgroundWorker)来处理请求。队列/出队机制可能对此很好工作。然后,当项目清除队列时,您可以使用客户端方法(而不是基本的“获取”请求)将响应泵回。
如果可能的话,传递一个数组而不是发送大量的小请求。如果您出于用户体验/性能的原因希望将其加载为“块”,请在性能仍然成问题的情况下尝试更大的块。