阅读:2150回复:2
Unity3d利用线程池ThreadPool多线程下载
其实百度一下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 ![]() |
|
最新喜欢:![]() |
沙发#
发布于:2016-04-23 11:42
![]() |
|
|