我用线程池复制粘贴文件,一共1000个文件,大小在几百KB到10MB,不管最大线程设成几,都会卡死,线程池里的方法也用begininvoke了也不行。
复制粘贴文件是用文件流进行复制,每次读取1024*4大小的字节,读写间没有写延时
C#用线程池复制粘贴文件主界面卡死了
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- wanghui0380 2023-06-29 18:07关注
你不好奇几乎所有的下载软件,转换工具都会设定5-10个并行任务么
我们说5个并行任务,而非啥子“最大并行线程”,why,因为线程是切换的,我们是可以允许同时最大并行10个线程,但线程是切换的。他来回切换10次,那么其实就是100个线程在跑。
所以这里需要做的事情是限制任务量而非限制线程量。
当然他没chartgpt说的那么复杂了,一个SemophoreSlim就够了
简单逻辑SemophoreSlim slim=new SemophoreSlim(10); async task copyfile( 源,目标,报告对象Process) { await slim.waitone() //获取执行权限,虽然你外面可以循环,可以线程,可以并行,但是我就10个令牌,只有拿到令牌的才做,没有拿到令牌的就等着, //做你要做的事情 slim.释放令牌 }
写在最后,所谓“线程”不是越多越好,IO任务主要瓶颈在IO上,而非cpu上。说copy文件磁盘效率也许你无法理解。
换成网络了你应该能理解了,5个下载任务已经把下行500M带宽都用光了,那么你在开100个线程还有意义么?后面无论开多少个线程都还是抢那500M带宽,反而每个任务下载时间更长换到文件copy上其实一样的,5-10个任务就行了,后面无论多少个都是等前面一个完成了交出令牌了在进去
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 短剧的sdk在哪里接入
- ¥15 求:可不可以提供一些 在国内可以用,低代码不要太难 在电脑上可以下载的 制作app的软件
- ¥60 找人回答kibana8.14.3二次集成开发,自定义插件ui导航栏如何设置
- ¥15 fluke高精度万用表8845A型号测交流电压一直跳动,且去掉输入后显示不归零
- ¥15 不同模型怎么用同一个shader
- ¥15 安卓启动没有ais proxy与v4l2的log打印
- ¥15 go怎么读取mdb文件里面的数据
- ¥60 Matlab联合CRUISE仿真编译dll文件报错
- ¥15 脱敏项目合作,ner需求合作
- ¥15 脱敏项目合作,ner需求合作