问题描述
publicstaticboolFtpDownLoadMulti(List<string>remoteFiles,stringpath,Action<int,int>updateProgress){Dictionary<Thread,ProgressInfo>infos=newDictionary<Thread,ProgressInfo>();foreach(stringsinremoteFiles){stringfile=s;ProgressInfopi=newProgressInfo();string[]e=file.Split('/');pi.localFile=e[e.Length-1];pi.remoteFile=file;Threadt=newThread(newThreadStart(delegate(){FtpDownLoad(file,path+e[e.Length-1],true,pi.ProgressCallBack);}));t.Start();infos.Add(t,pi);}try{intupdated=0,all=1;while(infos.Count>0){Monitor.Enter(infos);System.Threading.Thread.Sleep(500);updated=0;all=1;foreach(varitemininfos){updated+=item.Value.updatedBytes;all+=item.Value.totalBytes;}if(updateProgress!=null){updateProgress(updated,all);}if(updated==all){foreach(varitemininfos){item.Key.Abort();}infos.Clear();}Monitor.Exit(infos);}returntrue;}catch(Exceptione){Debug.LogException(e);returnfalse;}}
解决方案
解决方案二:
百度一下,你就知道~~~
解决方案三:
#1百度到了我就不到这求助了
解决方案四:
又死循环、同时又阻塞,这种程序我们决不允许使用的。
解决方案五:
线程能挂起就别关。进程退出才安全。
解决方案六:
这不是死循环吧?
解决方案七:
楼上的大哥可以提供可行的写法吗?小弟刚开始使用多线程,用的不好。请直接提出来,同时请给出正确方案或思路建议,谢谢了
解决方案八:
如果你不知道如何写出比较可行的并发多线程程序,那么建议你i就不要纠结于低层的编程语句。你可以使用比较高级的框架,例如PLinq()。当年使用低层的编程语句时,你纠结的东西就很多了。有些人总是认为“越是底层的东西越厉害”,其实十有八九都会因为他刚好学了“半桶水”因此才喜欢纠结于底层技术。如果你高效率地开发大系统,往往回归比较高生产率的编程开发方式,而不是写一大坨过于底层的代码。
解决方案九:
滥用死循环跟滥用多种阻塞方法(你用了至少2、3种)必定是伴生的,这种纠结在一起的东西,造成了你的软件的效率甚至可能连单线程的程序都不如,而且你的cpu被占用得厉害,电脑根本不能做更多的分时任务了。编写并发多线程程序,首先要把基本原则搞懂,就是要无谓的避免阻塞和循环,要从逻辑设计上下功夫重构。对你写的那类程序来说,线程会让系统更慢更卡,线程反而成了“坑”了。
解决方案十:
就是要无谓的避免阻塞和循环-->就是要避免无谓的阻塞和循环
解决方案十一:
上边的代码就是循环检测同时回传进度updateProgress(updated, all);,达到条件if(updated==all)就退出,并且释放线程。sp老大说的PLinq也许是一个封装的很好的多线程查询工具,但是我现在并不需要。希望我以上的代码以及写的思路做一些实质性的改进意见。小弟万分感谢