您的位置:程序门 -> .net技术 -> c#



高分求助:c#的下载代码里如何控制线程的个数和每个用户的下载流量


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


高分求助:c#的下载代码里如何控制线程的个数和每个用户的下载流量[已结贴,结贴人:ringwangjx]
发表于:2007-10-13 09:30:03 楼主
因为我有一个下载页面供客户下载资料,但下载的人多了,经常死机,因此我想控制每个人下载的流量,请问这个如何实现。
如果在iis里控制听说会控制整个网站的速度,但我不想限制访问页面的速度,因此,只有从下载的代码里控制下载的速度了,请高手解答啊,最好有原代码,有高分送,谢谢啊。
发表于:2007-10-13 09:36:011楼 得分:10
up
发表于:2007-10-13 09:53:052楼 得分:70
写一个专门用于文件下载的类。实现文件下载时流量等相关信息的处理。
c# code
using system; using system.data; using system.configuration; using system.web; using system.web.security; using system.web.ui; using system.web.ui.webcontrols; using system.web.ui.webcontrols.webparts; using system.web.ui.htmlcontrols; using system.io; using system.threading; /// <summary> /// filedownload 的摘要说明 /// </summary> public class filedownload { /// <summary> /// 输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小 /// </summary> /// <param name="_request">page.request对象</param> /// <param name="_response">page.response对象</param> /// <param name="_filename">下载文件名</param> /// <param name="_fullpath">带文件名下载路径</param> /// <param name="_speed">每秒允许下载的字节数</param> /// <returns>返回是否成功</returns> public static bool responsefile(httprequest _request, httpresponse _response, string _filename, string _fullpath, long _speed) { try { filestream myfile = new filestream(_fullpath, filemode.open, fileaccess.read, fileshare.readwrite); binaryreader br = new binaryreader(myfile); try { _response.addheader("accept-ranges", "bytes"); _response.buffer = false; long filelength = myfile.length; long startbytes = 0; int pack = 10240; //10k bytes //int sleep = 200; //每秒5次 即5*10k bytes每秒 int sleep =int)math.floor((decimal)1000 * pack / _speed) + 1; if (_request.headers["range"] != null) { _response.statuscode = 206; string[] range = _request.headers["range"].split(new char[] { '=', '-' }); startbytes = convert.toint64(range[1]); } _response.addheader("content-length", (filelength - startbytes).tostring()); if (startbytes != 0) { _response.addheader("content-range", string.format(" bytes {0}-{1}/{2}", startbytes, filelength - 1, filelength)); } _response.addheader("connection", "keep-alive"); _response.contenttype = "application/octet-stream"; _response.addheader("content-disposition", "attachment;filename=" + httputility.urlencode(_filename, system.text.encoding.utf8)); br.basestream.seek(startbytes, seekorigin.begin); int maxcount =int)math.floor((decimal)(filelength - startbytes) / pack) + 1; forint i = 0; i < maxcount; i++) { if (_response.isclientconnected) { _response.binarywrite(br.readbytes(pack)); thread.sleep(sleep); } else { i = maxcount; } } } catch { return false; } finally { br.close(); myfile.close(); } } catch { return false; } return true; } }
发表于:2007-10-13 09:55:413楼 得分:0
如果是ftp,可以在ftp管理软件(如servu)里专门开一个帐号用于该项下载,然后在ftp管理软件中控制该帐号的流量。
发表于:2007-10-13 10:13:454楼 得分:0
感谢2楼的支持,但是我以前就是用的这个代码下载,是多线程的,还支持断点续传,但是我要的是在这个基础上可以控制每个用户的线程数量和每个用户的下载流量或者是每个线程的流量。能不能帮忙解决啊,谢谢
回复3楼的,不用下载软件,只用下载的页面。谢谢

在线等待。。。
急啊。。。
发表于:2007-10-13 10:53:455楼 得分:0
学习
发表于:2007-10-15 11:37:326楼 得分:0
2楼的经测试可以控制每个线程的下载速度,但不能控制线程个数
有没有办法啊,给个代码马上给分
不过还是要感谢你。
发表于:2007-10-15 15:47:257楼 得分:0
mark
发表于:2007-10-15 16:28:548楼 得分:0
用信号量(semaphore)控制线程的个数
发表于:2007-10-16 09:04:099楼 得分:0
8楼,咋控制啊,能不能给个例子啊,小弟先谢了。
发表于:2007-10-16 10:43:3310楼 得分:20
我也不知道适不适用你说的场合,不过可以试试看,
信号量(semaphore)在.net   framework   2.0   版才有的,
这里有简单的例子,
http://msdn2.microsoft.com/zh-cn/library/system.threading.semaphore(vs.80).aspx
发表于:2007-10-16 11:59:0311楼 得分:0
2楼的代码在本地测试觉得还行,但今天放到服务器测试出问题了,因为访问的人多了,出现死机,但cpu和内存使用不多,估计是
if   (_response.isclientconnected)
                                        {
                                                _response.binarywrite(br.readbytes(pack));
                                                thread.sleep(sleep);                                         }

那个thread.sleep出问题了,好象这个没释放锁吧,这样导致其他的线程不能访问,因此出现死机状态。
但是对同一个文件如果不锁定会不会下载时数据出现错误呢,难难难。

发表于:2007-10-16 12:05:0212楼 得分:0
只是读不修改数据,应该不会出错吧?
发表于:2007-10-16 13:41:4113楼 得分:0
但是几个线程如何同步,又可以并发,如果不同步,那数据读取的时候不就乱了啊,总的配合吧。
...


快速检索

最新资讯
热门点击