C# 异步与同步WebRequest,是否有必要?

C# 异步与同步WebRequest,是否有必要?,c#,multithreading,asp.net-mvc-3,asynchronous,synchronous,C#,Multithreading,Asp.net Mvc 3,Asynchronous,Synchronous,背景: 作为MVC3解决方案的一部分,我正在编写一个RouteHandler。它的目的是从我的云存储中获取图像和文件,并将它们发送到浏览器,同时屏蔽云存储URL 因此,来自“媒体”子域的所有内容都被路由到我的MediaRouteHandler,我在那里实现了获取图像的逻辑 我正在努力为HttpWebRequest获得一个异步实现。充其量它的行为是不稳定的。有时正确地放下图像,有时不正确 问题: 所以,我的问题是 标准浏览器是同步还是异步加载图像?或者我正在尝试做一些连浏览器都没有做的事情(只是在

背景:

作为MVC3解决方案的一部分,我正在编写一个RouteHandler。它的目的是从我的云存储中获取图像和文件,并将它们发送到浏览器,同时屏蔽云存储URL

因此,来自“媒体”子域的所有内容都被路由到我的MediaRouteHandler,我在那里实现了获取图像的逻辑

我正在努力为HttpWebRequest获得一个异步实现。充其量它的行为是不稳定的。有时正确地放下图像,有时不正确

问题:

所以,我的问题是

标准浏览器是同步还是异步加载图像?或者我正在尝试做一些连浏览器都没有做的事情(只是在浪费我的时间)

i、 如果浏览器获取图像的默认方式是通过同步线程,那么我很乐意这样做

是这样吗

谢谢

一点测试:

这是我的同步路由处理程序的结果。您将看到图像请求重叠,通过使用fiddler模拟调制解调器下载速度,我可以看到它们以不同的速度同时下降


浏览器异步加载图像,但实际上异步加载的主要原因不是阻止线程(以及一些并行性)。如果您真的很难处理服务器端的异步请求,那么请尝试在后台线程中将所有调用包装为同步。这样,您就不会阻塞主线程,并且仍然同步加载图像。但是我不确定这个场景是否能在ASP.NET MVC中正常工作

如果一个接一个地请求图像,那么实际上每个
MediaRouteHandler
都在自己的线程中运行。因此,您只需对每个图像执行同步
HttpWebRequest
,因为没有任何内容被阻止(客户端浏览器仍然需要完整的图像文件)


请注意,由于性能优势,异步调用是值得考虑的。如果图像数据很长,您可以开始将数据推送到客户端浏览器,尽管还没有从云存储下载完整的数据。

它们是异步工作的。您是否曾经使用过低于无限速度的连接?你会看到它们加载进来。但是是浏览器还是框架在加载呢?浏览器可以为每个图像分配一个线程?想想看,这听起来像浏览器会做的事情吗?考虑到页面可能有数百个图像。这还没有考虑到所有非映像的资源。@shenku最“严肃”的IO工作是异步完成的;我完全希望大多数浏览器对他们的IO非常认真。MediaRouteHandler不是一个接一个地被请求(我的意思是:一次一个图像文件?)这也是我的想法,但我想得到一些确认,因为我不确定。然后,如果浏览器愿意的话,它将由浏览器加载这些数据的倍数,对吗?浏览器只是从URL请求数据,而不需要知道数据是如何提供的。但是,在收集所有数据(相当于
内容长度
)并给出正确的HTTP状态之前,它不会显示图像。。。由您来决定,即为频繁重用的映像提供一些缓存。如果您还将MediaRouteHandler作为IAsyncHttpHandler实现,则异步进行HttpWebRequest调用将显著提高web应用程序的可扩展性。有了这样的实现,图像从云端下载时就不会有阻塞线程。ASP.Net将重用线程池线程,否则这些线程将在等待同步HttpWebRequest完成时被阻止。更好的线程经济性->更好的可扩展性。浏览器不在乎你在服务器上做什么。它总是异步读取TCP流。