qq_43353945 2023-06-29 17:05 采纳率: 31.3%
浏览 26
已结题

C#用线程池复制粘贴文件主界面卡死了

我用线程池复制粘贴文件,一共1000个文件,大小在几百KB到10MB,不管最大线程设成几,都会卡死,线程池里的方法也用begininvoke了也不行。
复制粘贴文件是用文件流进行复制,每次读取1024*4大小的字节,读写间没有写延时

  • 写回答

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个任务就行了,后面无论多少个都是等前面一个完成了交出令牌了在进去

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月8日
  • 已采纳回答 6月30日
  • 修改了问题 6月29日
  • 创建了问题 6月29日

悬赏问题

  • ¥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需求合作