轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
阅读:945回复:2

Unity3d利用线程池ThreadPool多线程下载

楼主#
更多 发布于:2016-04-23 11:27
其实百度一下Http下载资源会出现很多高手的帖子,大家可以去看一下,最近项目遇到同时开很多线程下载的问题。记录一下,其中有个问题,请大家帮忙解决一下,多谢。
1 http下载资源的方式比较简单(这有个哥们的帖子:http://www.cnblogs.com/U-tansuo/p/unity3d_Threading_AsyDown_HTTP.html
1)链接资源: HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
2)获取响应:HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
3)获取数据流:Stream httpStream = response.GetResponseStream();
4)然后用一个buffer去读取数据:byte[]buffer = new byte[1024];int length = httpStream.Read(buffer, 0,buffer.Length);
5)最后用一个While循环去不断获取数据并写入本地即可:
while (length > 0)
                
        {
                
            fileStream.Write(buffer, 0, length);
                
            fileLength += length;
                
            fileStream.Flush();
                
            length = httpStream.Read(buffer, 0,buffer.Length);
                
        }


2 步骤1中完成了http下载,然后就是多线程的问题,其实也就是将上面的步骤放到一个Thread里面去完成,比如上方的步骤全部放到线程委托里即可,然后执行:Thread thread = new Thread(delegate(){.....方法1中的代码.....}); thread.Start();


3 步骤1和2弄完了多线程http下载,然后如果任务还是很重,需要很多个线程咋办,很多线程自己去管理很麻烦,经常开启和关闭浪费资源,微软提供了一个ThreadPool的静态类,利用它很容易做到线程管理,当然方便的东西肯定也有弊端(这都是后话):
a)设置ThreadPool的最大线程数:ThreadPool.SetMaxThreads(int workerThreads,int completionPortThreads);也就是线程池开满的情况有多少个线
程。
b)然后就把你的下载方法,也就是把Task往线程池里面放:QueueUserWorkItem(WaitCallback wc, Object state);
比如步骤1中的代码放到了Task(object _url)函数里,ThreadPool.QueueUserWorkItem(Task,"https://www.baidu.com/")
线程池会根据Task的个数去合理的帮你安排要开启的线程数,如果达到最大值,将会进入Queue等待,有子线程空出来后,然后再去执行。Task里面避免
耗时很长的任务。

问题:在按照上诉方法执行Http下载任务的时候遇到了个问题,当我的下载任务小于我线程池设置的最大线程数时,比如线程池最大线程为8,任务数小于
8,所有任务都能顺利完成;当任务数大于等于8的时候就无法下载,全部堵塞,堵塞的地方在HttpWebResponse 的地方,报错请求超时,如果我的任务
不是http任务只是计算任务,丢多少个任务进去都没问题。目前还没解决,请高手指点。

备注:httpWebRequest多线程请求系统默认是后台是两个,我在代码加了System.Net.ServicePointManager.DefaultConnectionLimit = 20;

图片:arvrshcool.jpg


最新喜欢:

dayelongshedayelo...

欢迎分享

归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2016-04-23 11:42
AR学院(www.arvrschool.com),从这里感触未来!
1739516172
精灵王
精灵王
  • UID748
  • 粉丝0
  • 关注3
  • 发帖数46
  • 社区居民
  • 忠实会员
板凳#
发布于:2016-04-29 09:06
游客

返回顶部